在numpy的日志功能中会发生什么?有没有办法改善表现?

Ton*_*ony 8 c# python performance matlab numpy

我有一个计算项目,大量使用日志函数(对于整数),数十亿的调用.我发现numpy的日志性能出乎意料地慢了.

以下代码需要15到17秒才能完成:

import numpy as np
import time

t1 = time.time()
for i in range(1,10000000): 
    np.log(i)
t2 = time.time()
print(t2 - t1)
Run Code Online (Sandbox Code Playgroud)

但是,math.log函数从3到4秒的时间要少得多.

import math
import time

t1 = time.time()
for i in range(1,10000000): 
    math.log(i)
t2 = time.time()
print(t2 - t1)
Run Code Online (Sandbox Code Playgroud)

我还测试了matlab和C#,它们分别需要大约2秒和0.3秒.

MATLAB

tic
for i = 1:10000000
    log(i);
end
toc
Run Code Online (Sandbox Code Playgroud)

C#

var t = DateTime.Now;
for (int i = 1; i < 10000000; ++i)
     Math.Log(i);
Console.WriteLine((DateTime.Now - t).TotalSeconds);
Run Code Online (Sandbox Code Playgroud)

在python中有什么办法可以提高日志功能的性能吗?

MSe*_*ert 5

NumPys 函数是为数组设计的,而不是为单个值或标量设计的。它们的开销相当高,因为它们进行多次检查和转换,这将为大数组提供速度优势,但对于标量来说这些成本很高。

\n\n

如果您检查返回的类型,转换非常明显:

\n\n
>>> import numpy as np\n>>> import math\n\n>>> type(np.log(2.))\nnumpy.float64\n>>> type(math.log(2.))\nfloat\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一方面,math-module 针对标量进行了优化。所以他们不需要那么多检查(我认为只有两个:转换为float并检查是否是它<= 0)。这就是为什么量比math.log更快。numpy.log

\n\n

但如果你对数组进行操作并想要取数组中所有元素的对数,NumPy 会快得多。在我的计算机上,如果我对np.log数组的执行时间与math.log列表中的每个项目的执行时间进行比较,那么时间看起来会有所不同:

\n\n
arr = np.arange(1, 10000000)\n%timeit np.log(arr)\n201 ms \xc2\xb1 959 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n\nlst = arr.tolist()\n%timeit [math.log(item) for item in lst]\n8.77 s \xc2\xb1 63.8 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,np.log在数组上速度会快很多数量级(在本例中快了 40 倍以上)!而且您不需要自己编写任何循环。因为 ufuncnp.log也可以正确地处理多维 numpy 数组,并且还允许就地执行操作。

\n\n

根据经验:如果您有一个包含数千个项目的数组,NumPy 会更快,如果您有标量或只有几十个项目math+显式循环,则会更快。

\n\n
\n\n

也不要用于time计时代码。有一些专用模块可以提供更准确的结果、更好的统计数据并在计时期间禁用垃圾收集:

\n\n\n\n

我通常使用%timeit这是一个方便的功能包装器timeit,但它需要IPython。他们已经方便地显示结果平均值和偏差,并进行一些(大部分)有用的统计,例如显示“7 中最佳”或“3 中最佳”结果。

\n\n
\n\n

我最近分析了另一个问题的 numpy 函数的运行时行为,其中一些要点也适用于此。

\n