【发布时间】:2016-10-15 08:58:11
【问题描述】:
有人知道为什么 pandas/numpy 地图比列表理解慢吗? 我想我可以优化我的代码,用 map 替换列表理解。由于 map 不需要列表追加操作。
这是一个测试:
df = pd.DataFrame(range(100000))
列表理解:
%timeit -n 10 df["A"] = [x for x in df[0]]
#10 loops, best of 3: 550 ms per loop
熊猫地图
%timeit -n 10 df["A"] = df[0].map(lambda x: x)
#10 loops, best of 3: 797 ms per loop
更新 基于下面的评论 - 列表理解和映射调用相同的函数 f,列表理解更快
def f(x):
return x
%timeit -n 100 df["A"] = df[0].map(f)
#100 loops, best of 3: 475 ms per loop
%timeit -n 100 df["A"] = [f(x) for x in df[0]]
#100 loops, best of 3: 399 ms per loop
【问题讨论】:
-
你想用
df[0].map(lambda x: x)实现什么? -
这不是一个公平的测试。
map必须在每个值处调用lambda函数(函数调用有开销),而列表推导可以绕过这一点。尝试定义f = lambda x: x,然后改用df["A"] = [f(x) for x in df[0]]。这在性能上会更接近。 -
@MaxU lambda x: x 是一个例子来说明在可能的地方使用列表推导而不是映射可以更快。例如,将带有 UnixEpoch 的列转换为 DateTime。
-
@ajcr 感谢您的评论。如果列表推导也调用一个函数,它仍然比 map 快一点。
-
在我的机器上使用
map实际上比列表理解要快一些。对于函数应用,我认为一个选项不一定比另一个更快(当涉及到函数应用时,它们基本上做同样的事情),所以我不确定你的问题是否能得到回答。
标签: python performance pandas list-comprehension