【发布时间】:2014-08-02 12:23:39
【问题描述】:
我正在尝试在 pandas 列中搜索字符串。我已经读过,首先对列进行排序并在值上使用 searchsorted 搜索字符串应该是最快的。我发现这比在同一个 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 数组的性能要好得多?以及如何使用从 pandas 表中提取的数据来实现相同的性能?
非常感谢。
【问题讨论】:
-
我相信 pandas 虽然在它下面使用了 numpy 数组,但它会进行更多的 dtype 检查和对齐,所以速度较慢:stackoverflow.com/questions/19834075/…
-
好的,但是在所有 3 种情况下,我都在 numpy 数组上进行操作。唯一的区别是,对于第一种情况,数组是原生构造为 numpy 数组,而在后两种情况下,数组是使用“值”从 pandas 数据帧中提取的。
-
您的第二个设置是排序并返回数据帧的副本,第三个设置不这样做,但构造数据帧然后将数据作为 numpy 数组返回似乎有一些开销。我不知道 pandas 的完整内部工作原理来解释更多,但只为数据框的创建计时会很有用,这样您就可以通过
.values了解将数据作为 numpy 数组进行排序和访问的成本 -
setup中的所有内容都不计入timeit的计时器中 -
啊,好吧,我误解了你的准确时间分析,是的,这很奇怪,除了排序的数据帧与未排序的数据帧之外,它们之间应该没有显着差异
标签: python arrays search numpy pandas