python - 速度比较。numpy vs python标准
问题描述
我做了一些实验,发现很多情况下 python 的标准random
和math
库比numpy
对应的更快。
我认为 python 的标准库对于小规模操作有大约 10 倍的速度,而numpy
对于大规模(向量)操作来说要快得多。我的猜测是,这numpy
有一些开销,这在小案例中占主导地位。
我的问题是:我的直觉正确吗?通常建议使用标准库而不是numpy
小型(通常是标量)操作吗?
示例如下。
import math
import random
import numpy as np
对数和指数
%timeit math.log(10)
# 158 ns ± 6.16 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit np.log(10)
# 1.64 µs ± 93.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit math.exp(3)
# 146 ns ± 8.57 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit np.exp(3)
# 1.72 µs ± 78.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
生成正态分布
%timeit random.gauss(0, 1)
# 809 ns ± 12.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit np.random.normal()
# 2.57 µs ± 14.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
选择一个随机元素
%timeit random.choices([1,2,3], k=1)
# 1.56 µs ± 55.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit np.random.choice([1,2,3], size=1)
# 23.1 µs ± 1.04 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
与 numpy 数组相同
arr = np.array([1,2,3])
%timeit random.choices(arr, k=1)
# 1.72 µs ± 33.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit np.random.choice(arr, size=1)
# 18.4 µs ± 502 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
带大阵
arr = np.arange(10000)
%timeit random.choices(arr, k=1000)
# 401 µs ± 6.16 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.random.choice(arr, size=1000)
# 41.7 µs ± 1.39 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
解决方案
numpy
只是对大数据块的性能提升。如果数组不是相对较大,在将内存块倒入ndarray
c 编译函数之前确保内存块正确排列的开销通常会压倒任何时间收益。numpy
这就是为什么这么多问题基本上都是“我如何使用这个循环代码并让它变得更快”,以及为什么它在这个标签中被认为是一个有效的问题,几乎任何其他标签都会在它们超过标题之前numpy
将你扔给代码审查.
所以,是的,你的观察是可以推广的。矢量化是numpy
. numpy
未矢量化的代码总是比裸python
代码慢,并且可以说就像用手提钻破解单个核桃一样“错误”。要么找到合适的工具,要么获得更多的坚果。
推荐阅读
- c# - 运行 POST 方法 WEPAPI 时出错
- python-3.x - 从 pandas 数据框创建字典
- java - 如何检索editText值并将其添加到列表中
? - spring-webflux - 控制器是否应该将集合包装到 Flux 中?
- sql - Postgresql 在大数据集上的 OVERLAPS 性能
- spring-boot - Spring Security/Spring Data Repository - 如何保护所有方法,具体取决于主体与 user_id 列匹配?
- excel - Excel 更改事件
- r - equivalent of hoverEdge for clicks in in Shiny for visNetwork
- python - Filtering what gets displayed on graph (Sypder (Python 3.7)
- python-3.x - Problems about realization of VAE with Pytorch