I am trying to search a string in a pandas column. I have read that it should be fastest to sort the column first and search the string using searchsorted on the values. I figured out that this is slower than searching brute force (array == string) on a same numpy array. To see why, I have performed the following tests:
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))
With the following result:
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
My question here: Why is the performance on the pure numpy array so much better? And how could I achieve the same performance using the data extracted from the pandas table?
Thank you very much.
.valuessetupis not counted in the timer oftimeit