Pandas 性能比较 apply 与 map

Fel*_*ida 2 python numpy dataframe pandas

我正在比较使用mapapply

我预计该apply版本会快得多,因为我正在做一个矢量化的 numpy 函数,而不是一次对一个元素进行操作。

然而,情况并非如此,两个版本的性能相同:

应用版本:

import pandas as pd
import numpy as np

np.random.seed(42)

df1 = pd.DataFrame({
    'x': np.random.random(size=10000000)
})

df1['2x'] = df1['x'].apply(lambda arr: arr*2)
# CPU times: user 1.64 s, sys: 180 ms, total: 1.82 s
# Wall time: 1.82 s
Run Code Online (Sandbox Code Playgroud)

地图版本:

import pandas as pd
import numpy as np

np.random.seed(42)

df2 = pd.DataFrame({
    'x': np.random.random(size=10000000)
})

df2['2x'] = df2['x'].map(lambda element: element *2)
# CPU times: user 1.65 s, sys: 180 ms, total: 1.83 s
# Wall time: 1.83 s
Run Code Online (Sandbox Code Playgroud)

使用的版本:Python 3.6.7、Pandas 0.24.2、Numpy 1.16.3

为什么apply版本不比版本快得多map,因为它使用的是 numpy 向量化函数?

Joh*_*nck 6

apply()只是一个伪装的 for 循环,它没有被向量化你通过调用 lambda element 欺骗了自己arr,但实际上它是一个标量。

相反,保持简单,这就像快 100 倍:

df1['2x'] = df1['x'] * 2
Run Code Online (Sandbox Code Playgroud)

  • @FelipeAlmeida `.apply` 和 `.map` 都只是变相的 python for 循环,它们是方便的方法,并不意味着性能。 (4认同)
  • @FelipeAlmeida:那是因为现在您每列应用一个函数调用,而不是每行一个。所以 [[]] apply 与我的答案中更简单的解决方案相同。 (2认同)