gpt4 book ai didi

python Pandas : why map is faster?

转载 作者:太空狗 更新时间:2023-10-29 17:57:21 26 4
gpt4 key购买 nike

在pandas的手册中,有一个关于索引的例子:

In [653]: criterion = df2['a'].map(lambda x: x.startswith('t'))
In [654]: df2[criterion]

然后韦斯写道:

**# equivalent but slower**
In [655]: df2[[x.startswith('t') for x in df2['a']]]

这里有人能解释一下为什么 map 方法更快吗?这是 python 功能还是 pandas 功能?

最佳答案

关于为什么 Python 中某种特定的处理方式“应该”更快的争论不能太认真,因为您经常测量在某些情况下可能表现不同的实现细节。因此,当人们猜测什么应该更快时,他们通常(通常?)是错误的。例如,我发现 map 实际上可能更慢。使用此设置代码:

import numpy as np, pandas as pd
import random, string

def make_test(num, width):
s = [''.join(random.sample(string.ascii_lowercase, width)) for i in range(num)]
df = pd.DataFrame({"a": s})
return df

让我们比较一下他们制作索引对象所花费的时间——无论是 Series 还是 list——以及使用该对象进行索引所花费的最终时间进入 DataFrame。例如,创建列表可能很快,但在将其用作索引之前,需要在内部将其转换为 Seriesndarray 等那里增加了额外的时间。

首先,对于一个小框架:

>>> df = make_test(10, 10)
>>> %timeit df['a'].map(lambda x: x.startswith('t'))
10000 loops, best of 3: 85.8 µs per loop
>>> %timeit [x.startswith('t') for x in df['a']]
100000 loops, best of 3: 15.6 µs per loop
>>> %timeit df['a'].str.startswith("t")
10000 loops, best of 3: 118 µs per loop
>>> %timeit df[df['a'].map(lambda x: x.startswith('t'))]
1000 loops, best of 3: 304 µs per loop
>>> %timeit df[[x.startswith('t') for x in df['a']]]
10000 loops, best of 3: 194 µs per loop
>>> %timeit df[df['a'].str.startswith("t")]
1000 loops, best of 3: 348 µs per loop

在这种情况下,listcomp 是最快的。这实际上并没有让我感到太惊讶,说实话,因为通过 lambda 可能比直接使用 str.startswith 慢,但它真的很难猜测。 10 已经足够小了,我们可能仍在测量诸如 Series 的设置成本之类的东西;在更大的框架中会发生什么?

>>> df = make_test(10**5, 10)
>>> %timeit df['a'].map(lambda x: x.startswith('t'))
10 loops, best of 3: 46.6 ms per loop
>>> %timeit [x.startswith('t') for x in df['a']]
10 loops, best of 3: 27.8 ms per loop
>>> %timeit df['a'].str.startswith("t")
10 loops, best of 3: 48.5 ms per loop
>>> %timeit df[df['a'].map(lambda x: x.startswith('t'))]
10 loops, best of 3: 47.1 ms per loop
>>> %timeit df[[x.startswith('t') for x in df['a']]]
10 loops, best of 3: 52.8 ms per loop
>>> %timeit df[df['a'].str.startswith("t")]
10 loops, best of 3: 49.6 ms per loop

现在看来 map 在用作索引时似乎更胜一筹,尽管差异很小。但没那么快:如果我们手动将 listcomp 转换为 arraySeries 会怎么样?

>>> %timeit df[np.array([x.startswith('t') for x in df['a']])]
10 loops, best of 3: 40.7 ms per loop
>>> %timeit df[pd.Series([x.startswith('t') for x in df['a']])]
10 loops, best of 3: 37.5 ms per loop

现在 listcomp 又赢了!

结论:谁知道呢?但是,如果没有 timeit 结果,请不要相信任何事情,即便如此,您也必须问自己是否在测试您认为的自己。

关于 python Pandas : why map is faster?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18932254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com