Time-Taken: np.sum vs sum



实际上,与列表和元组等其他工具相比,Numpy完成所需的时间更少。但是从下面的代码中,如果我们取出np并检查所花费的时间,它大约是1.8秒,但是对于np求和花费的时间超过21秒。你能给我解释一下吗?

import numpy as np
import time
start = time.process_time() 
p = np.sum(range(1,100000000))   
print(time.process_time() - start)

我有较低的rep所以我不能评论,但这可能是因为将范围转换为numpy对象的时间

我会用这样的东西做基准测试:

import numpy as np
import time
vec = np.array(range(1, 1e8))
start = time.process_time() 
p = np.sum(vec)   
print(time.process_time() - start)

一些更有经验的用户可能会向您指出一个基准实用程序,它可以更好地描述时间消耗的地方

尽我所能将苹果与苹果进行比较,让我们完整地创建一个列表和一个整数数组,范围从1到1,000,000:

import numpy as np
lst = list(range(1, int(1e6)))
vec = np.arange(1, 1e6, dtype=int)

现在让我们使用jupyter中专门构建的计时实用程序来比较这些操作:

%%timeit
sum(lst)

这给了我:

9.14 ms±379µs/loop(平均值±std. dev. of 7次运行,每次100个循环)

%%timeit
vec.sum()

这给了我:

957µs±39.1µs/loop(平均值±std. dev. of 7次运行,每次1000个循环)

因此,在我看来,如果确保您具有相同的数据类型,并且从计时中省略对象创建,那么numpy的性能就不会辜负它的要求。

似乎大部分时间都花在将python范围转换为np.array上。你可以查看:

import numpy as np
import time
start = time.process_time() 
p = np.array(range(1,100000000))   
print(time.process_time() - start)

在我的CPU上大约16秒。

np.sum(range(1,100000000))按以下顺序执行:

  1. range函数正在创建一个生成器
  2. np。数组正在从生成器创建(这是花费时间最多的地方)
  3. np。正在计算总和

我建议你用np.arange代替range:

import numpy as np
import time
start = time.process_time() 
p = np.sum(np.arange(1,100000000))   
print(time.process_time() - start)

在这种情况下,总和的计算速度比sum(range(1,100000000))快。

最新更新