实际上,与列表和元组等其他工具相比,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))
按以下顺序执行:
range
函数正在创建一个生成器- np。数组正在从生成器创建(这是花费时间最多的地方)
- 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))
快。