PythonでSQLite3とapswの速度を徹底比較!高速化に最適なライブラリは?

Pythonでデータベース操作を行う際に、SQLite3とapswのどちらを使うか迷う方も多いのではないでしょうか?

本記事では、apswがsqliteデータベースを扱う上で高速だと噂を聞いたので、実際にSQLite3とapswの速度比較を実際にコードを用いて行い、それぞれのライブラリの性能を徹底的に検証します。

高速化に最適なライブラリは一体どちらなのか? データの書き込み、読み込み、それぞれのパフォーマンスを比較し、具体的な結論を導き出します。

実験内容

SQLite3とapswの速度比較を以下の条件で行いました。

  • データベースファイル: data_sqlite3.db (SQLite3用), data_apsw.db (apsw用)
  • テーブル名: test_table
  • 書き込みデータ数: 10,000件
  • データ内容: (id, name, value)

コード

SQLite3

import sqlite3
import time

# データベースファイル名
database_file = 'data_sqlite3.db'

# テーブル名
table_name = 'test_table'

# 書き込みデータ数
data_count = 10000

# データ書き込み処理
def write_data(data_count):
    conn = sqlite3.connect(database_file)
    cursor = conn.cursor()

    # テーブル作成
    cursor.execute(f'''
        CREATE TABLE IF NOT EXISTS {table_name} (
            id INTEGER PRIMARY KEY,
            name TEXT,
            value INTEGER
        )
    ''')

    # データ書き込み
    start_time = time.time()
    for i in range(data_count):
        cursor.execute(f'''
            INSERT INTO {table_name} (name, value) VALUES (?, ?)
        ''', (f'Name {i}', i))
    conn.commit()
    end_time = time.time()

    print(f"データ書き込み完了 (時間: {end_time - start_time:.2f} 秒)")

    conn.close()

# データ読み込み処理
def read_data():
    conn = sqlite3.connect(database_file)
    cursor = conn.cursor()

    # データ読み込み
    start_time = time.time()
    cursor.execute(f"SELECT * FROM {table_name}")
    data = cursor.fetchall()
    end_time = time.time()

    print(f"データ読み込み完了 (時間: {end_time - start_time:.2f} 秒)")

    conn.close()

def main():
    # データ書き込み
    write_data(data_count)

    # データ読み込み
    read_data()

if __name__ == '__main__':
    main()

apsw

import apsw
import time

# データベースファイル名
database_file = 'data_apsw.db'

# テーブル名
table_name = 'test_table'

# 書き込みデータ数
data_count = 10000

# データ書き込み処理
def write_data(data_count):
    # データベース接続
    db = apsw.Connection(database_file)

    # テーブル作成
    db.execute(f'''
        CREATE TABLE IF NOT EXISTS {table_name} (
            id INTEGER PRIMARY KEY,
            name TEXT,
            value INTEGER
        )
    ''')

    # データ書き込み
    start_time = time.time()
    for i in range(data_count):
        db.execute(f'''
            INSERT INTO {table_name} (name, value) VALUES (?, ?)
        ''', (f'Name {i}', i))
    end_time = time.time()

    print(f"データ書き込み完了 (時間: {end_time - start_time:.2f} 秒)")

    # データベース接続を閉じる
    db.close()

# データ読み込み処理
def read_data():
    # データベース接続
    db = apsw.Connection(database_file)

    # データ読み込み
    start_time = time.time()
    cursor = db.execute(f"SELECT * FROM {table_name}")
    data = cursor.fetchall()
    end_time = time.time()

    print(f"データ読み込み完了 (時間: {end_time - start_time:.2f} 秒)")

    # データベース接続を閉じる
    db.close()

def main():
    # データ書き込み
    write_data(data_count)

    # データ読み込み
    read_data()

if __name__ == '__main__':
    main()

実験結果

SQLite3

データ書き込み完了 (時間: 0.03 秒)
データ読み込み完了 (時間: 0.02 秒)

apsw

データ書き込み完了 (時間: 68.25 秒)
データ読み込み完了 (時間: 0.01 秒)

考察

実験結果から、書き込み処理ではSQLite3が圧倒的に高速、読み込み処理ではapswがわずかに高速という結果になりました。

  • 書き込み: SQLite3は、C言語で実装された軽量なライブラリで、オーバーヘッドが小さく、高速な書き込み処理を実現しています。
  • 読み込み: apswもC言語で実装されており、SQLite3と比較して効率的にデータを処理できる可能性があります。

まとめ

apswは、読み込み処理においてわずかに高速ですが、書き込み処理ではSQLite3に大きく劣るようです。

大量のデータを高速に書き込む必要がある場合は、SQLite3が最適です。

大量のデータを高速に読み込む必要があり、書き込み頻度が低い場合は、apswが有効です。

ただし、apswはSQLite3よりもいろいろな機能を持ち合わせているので複雑なライブラリであり、使いこなすにはある程度の学習コストが必要です。
※単に書き出し・読み出しをするだけであればどちらも使い勝手はかわりません。

ご自身のアプリケーションのニーズに合わせて、最適なライブラリを選択してください。


最後に、Pythonの基礎を学びたい方は以下がおすすめです。私も持っていてたまに眺めて勉強していますものですのでぜひ購入して学習してみてください。

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!! にほんブログ村

Recent Posts

PlantUMLでロバストネス図を簡単に作成!

システム設計をスムーズに進める…

1日 ago

PlantUMLでクラス図を簡単に作成!

PlantUMLを用いてクラス…

2日 ago

PlantUMLでユースケース図を簡単に作成!

システム開発の設計でよく使うユ…

3日 ago

PlantUMLで美しいフローチャートを簡単に作成!

システム設計や業務フローの可視…

4日 ago

PlantUMLでシーケンス図を簡単に作成!

システムの設計や説明って、難し…

5日 ago