2つの異なるデータベースから2つの異なるテーブルがあります。両方のテーブルに大量のデータがありますが、両方のテーブルに同じ列があります。
以下のコードを試してみると、パフォーマンスの問題が発生しています(従業員テーブルには2つのレコードしかありませんが、部門テーブルには10万レコードあります)。比較に10分以上かかります。
パフォーマンスを低下させて高速化する方法はありますか?
EmplTbl = cur.execute("select A , B , C from EmployeeTable where EmplName in ('A','B')")
for line in EmplTbl:
EmplData.append(line)
DeptTbl = cur.execute("select A , B , C from DeptTable")
for line in DeptTbl:
DeptData.append(line)
for Empl in EmplData:
DeptResult = all(Empl in DeptData for elm in DeptData)
if DeptResult:
print("Yes")
else:
print("No")
あなたのコードはあなたが期待するよりも指数関数的に多くの仕事をしているようです。あなたのライン:
DeptResult = all(Empl in DeptData for elm in DeptData)
暗黙的に実行しています:
DeptResult = True
for elem in DeptData:
for tmp in DeptData:
DeptResult = DeptResult and Empl == tmp
つまりDeptData
、必要なのが1つだけの場合に、ネストされたパスを2つ作成するため、len(DeptData) ** 2
操作が必要になります。これは、1e10の比較を行おうとしていることを意味し、完了するまでに非常に長い時間がかかります。
私はこれを次のように書き直します:
cur.execute("select A , B , C from DeptTable")
dept_entries = set(cur)
cur.execute("select A , B , C from EmployeeTable where EmplName in ('A','B')")
for empl in cur:
if empl in dept_entries:
print(empl, 'Yes')
else:
print(empl, 'No')
Pythonデータベースコネクタは通常、execute
メソッドから結果を返さないため、fetch*
メソッドの1つを呼び出すか、カーソルを反復処理する必要があることに注意してください。私はOracleを使用していませんが、他の投稿では、標準に従う必要があり、コードが壊れていることが示唆されています
を入れるDeptTable
というset
ことは、ルックアップが今O(1)
であり、したがってempl in dept_entries
非常に安いことを意味します
注:tuple
Pythonで平等がどのように機能するかについてのチュートリアルset
や、基本的な反復のようなデータ構造を確認する価値があるかもしれません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加