python pandas series加速原理_python – 为什么pandas.series.map如此震惊?

有些日子我只是讨厌使用中间件.以此为例:我想要一个查找表,将一组输入(域)值中的值映射到输出(范围)值.映射是唯一的.

Python地图可以做到这一点,但由于地图非常大,我想,为什么不使用ps.Series及其索引,这增加了我可以的好处:

>传递多个值以映射为一系列(希望比字典查找更快)

>原始系列’索引保持在结果中

像这样:

domain2range = pd.Series(allrangevals, index=alldomainvals)

# Apply the map

query_vals = pd.Series(domainvals, index=someindex)

result = query_vals.map(domain2range)

assert result.index is someindex # Nice

assert (result.values in allrangevals).all() # Nice

按预期工作.但不是.上面的.map的时间成本增加了len(domain2range)而不是(更明智地)O(len(query_vals)),如下所示:

numiter = 100

for n in [10, 1000, 1000000, 10000000,]:

domain = np.arange(0, n)

range = domain+10

maptable = pd.Series(range, index=domain).sort_index()

query_vals = pd.Series([1,2,3])

def f():

query_vals.map(maptable)

print n, timeit.timeit(stmt=f, number=numiter)/numiter

10 0.000630810260773

1000 0.000978469848633

1000000 0.00130645036697

10000000 0.0162791204453

捂脸.在n = 10000000时,每个映射值取(0.01/3)秒.

所以,问题:

> Series.map预计会表现得像这样吗?为什么这么彻底,可笑得很慢?我想我正在使用它,如文档中所示.

>有没有一种快速的方法来使用pandas进行表查找.看来上面不是吗?

热身是个问题. (double facepalm). Pandas在第一次使用时默默地构建和缓存哈希索引(O(maple)).调用测试函数并预先建立索引的性能更好.

numiter = 100

for n in [10, 100000, 1000000, 10000000,]:

domain = np.arange(0, n)

range = domain+10

maptable = pd.Series(range, index=domain) #.sort_index()

query_vals = pd.Series([1,2,3])

def f1():

query_vals.map(maptable)

f1()

print "Pandas1 ", n, timeit.timeit(stmt=f1, number=numiter)/numiter

def f2():

query_vals.map(maptable.get)

f2()

print "Pandas2 ", n, timeit.timeit(stmt=f2, number=numiter)/numiter

maptabledict = maptable.to_dict()

query_vals_list = pd.Series([1,2,3]).tolist()

def f3():

{k: maptabledict[k] for k in query_vals_list}

f3()

print "Py dict ", n, timeit.timeit(stmt=f3, number=numiter)/numiter

print

pd.show_versions()

Pandas1 10 0.000621199607849

Pandas2 10 0.000686831474304

Py dict 10 2.0170211792e-05

Pandas1 100000 0.00149286031723

Pandas2 100000 0.00118808984756

Py dict 100000 8.47816467285e-06

Pandas1 1000000 0.000708899497986

Pandas2 1000000 0.000479419231415

Py dict 1000000 1.64794921875e-05

Pandas1 10000000 0.000798969268799

Pandas2 10000000 0.000410139560699

Py dict 10000000 1.47914886475e-05

…虽然令人沮丧的是python词典速度提高了10倍.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值