我想在熊貓列中搜索一個字符串。我已經讀過,它應該是最快排序的第一列和搜索字符串使用搜索排序值。我發現這比在同一個numpy數組上搜索蠻力(array == string)要慢。要知道爲什麼,我已經進行了以下試驗:python熊貓與numpy數組的搜索性能
import timeit
setup4 = '''
import numpy as np, string, random
d = np.array([
u''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(16))
for _ in range(20000)
],dtype=np.object)
'''
setup5 = '''
import numpy as np, pandas as pd, string, random
header = [
u'A',
u'B',
u'C',
u'D',
u'E',
u'F',
u'G',
u'H',
u'I',
u'J',
u'K',
u'L',
u'M',
u'N'
]
data = [[pd.to_datetime('20140505'),
u''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(16)),
u''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(16)),
u'sfgweorfjdfl',
u'dsiofqjwel;dmfv',
u'e3ruiwefjvgoiubg',
u'3124oirjrg;klhbas',
u';3rhfgfbnvsad3r',
pd.to_datetime('20140505'),
u'1234irtjurgbfas',
u'12;rhfd;hb;oasere',
u'124urgfdnv.,sadfg',
u'1rfnhsdjk.dhafgsrdew',
u'safeklrjh2nerfgsd.'
] for _ in range(20000)]
df = pd.DataFrame(data,columns=header)
df_sorted = df.sort(['B','C'])
e = df_sorted['B'].values
'''
setup6 = '''
import numpy as np, pandas as pd, string, random
header = [
u'A',
u'B',
u'C',
u'D',
u'E',
u'F',
u'G',
u'H',
u'I',
u'J',
u'K',
u'L',
u'M',
u'N'
]
data = [[pd.to_datetime('20140505'),
u''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(16)),
u''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(16)),
u'sfgweorfjdfl',
u'dsiofqjwel;dmfv',
u'e3ruiwefjvgoiubg',
u'3124oirjrg;klhbas',
u';3rhfgfbnvsad3r',
pd.to_datetime('20140505'),
u'1234irtjurgbfas',
u'12;rhfd;hb;oasere',
u'124urgfdnv.,sadfg',
u'1rfnhsdjk.dhafgsrdew',
u'safeklrjh2nerfgsd.'
] for _ in range(20000)]
df = pd.DataFrame(data,columns=header)
f = df['B'].values
'''
print(timeit.timeit("index = d == u'ASDASD123ASADKHX'", setup=setup4,number=1000))
print(timeit.timeit("index = e == u'ASDASD123ASADKHX'", setup=setup5,number=1000))
print(timeit.timeit("index = f == u'ASDASD123ASADKHX'", setup=setup6,number=1000))
結果如下:
print(timeit.timeit("index = d == u'ASDASD123ASADKHX'", setup=setup4,number=1000))
0.808505267014
print(timeit.timeit("index = e == u'ASDASD123ASADKHX'", setup=setup5,number=1000))
3.06733738226
print(timeit.timeit("index = f == u'ASDASD123ASADKHX'", setup=setup6,number=1000))
1.64207848896
我的問題在這裏:爲什麼是純numpy的陣列上的表現好多了?我如何使用從熊貓表中提取的數據實現相同的性能?
非常感謝。
我相信,大熊貓雖然用途它下面的numpy數組做更多的dtype檢查和對齊,所以更慢:http://stackoverflow.com/questions/19834075/pandas-much-slower-than-numpy – EdChum
好吧,但在所有3例,我運行在numpy數組上進行。唯一的區別是對於第一種情況,數組本身被構造爲一個numpy數組,而在後兩種情況下,數組是使用「值」從熊貓數據框中提取的。 – Felix
您的第二個設置是排序並返回數據幀的副本,第三個設置不會執行此操作,但似乎在構建數據幀時會有一些開銷,然後將數據作爲numpy數組返回。我不知道熊貓的全部內部工作原理來解釋更多的內容,但只需創建數據框就可以了,這樣就可以瞭解通過'.values將數據排序和訪問數據作爲一個numpy數組的成本。 ' – EdChum