2015-08-19 145 views
1

我有我從一個sqlite3數據庫拉出的21,000行,我需要把它放入一個字典,然後將其附加到數組。這個循環目前大約需要1.531秒,我正在儘可能地儘量減少它。我能做到這一點的速度更快? (我使用Python 2.7.3)提高循環效率

results = cursor.fetchall() 
array = [] 
for row in results: 
    a = {} 
    b = row[11] 
    c = str(row[8]) 
    d = str(row[9]) + " ? " + str(row[10]) 
    e = row[3] 
    f = row[4] 
    key = e + " - " + f 

    rowToAdd = { 'aaa': row[3], 
       'bbb' : row[0], 
       'ccc' : row[1], 
       'ddd' : row[12], 
       'eee' : row[2], 
       'fff' : row[9], 
       'ggg' : row[1], 
       'hhh' : str(row[6]) + " (" + str(row[5]) + ")", 
       'iii' : e, 
       'jjj' : d, 
       'kkk' : f 
    } 

    rowToAdd.append(array) 

有沒有一種方法能夠直接映射一個遊標輸出詞典與自定義鍵列表?

有沒有更加pythonic的方式來做到這一點,將加快?

+3

讓您的* SQL查詢*執行字符串連接併爲每列指定一個名稱。然後使用一個遊標來爲它的每一行生成一個字典,然後你所要做的就是'array = list(cursor)'。 –

+0

例如1.不追加,但預先分配數組,並只填充它,節省不必要的創建/銷燬中間階段2.刪除'dict'並使用sth else(甚至簡單的'list')應該更快 –

+0

@ NikosM .:字典不是什麼在這裏慢;它甚至使用文字語法。 –

回答

2

改爲將連接保留爲SQLite,並改爲使用sqlite3.Row row factory,從而爲您提供可用作元組和字典的對象。

有你查詢名稱使用列別名鍵:

cursor.execute(''' 
    SELECT 
     col3 as aaa, col9 as bbb, 
     col6 || ' (' || col5 || ')' as hhh, 
     col9 || ' ? ' || col10 as jjj 
    FROM SOME_TABLE 
''') 

然後只需使用該結果,而不是建立一個新的列表。如果您必須有一個清單,這些你可以使用:

array = cursor.fetchall() 

array = list(cursor) 

,但你,因爲你需要訪問該行很可能會遍歷結果更好。