首页 > 解决方案 > 速度比较。numpy vs python标准

问题描述

我做了一些实验,发现很多情况下 python 的标准randommath库比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)

标签: pythonnumpyrandom

解决方案


numpy只是对大数据块的性能提升。如果数组不是相对较大,在将内存块倒入ndarrayc 编译函数之前确保内存块正确排列的开销通常会压倒任何时间收益。numpy这就是为什么这么多问题基本上都是“我如何使用这个循环代码并让它变得更快”,以及为什么它在这个标签中被认为是一个有效的问题,几乎任何其他标签都会在它们超过标题之前numpy将你扔给代码审查.

所以,是的,你的观察是可以推广的。矢量化是numpy. numpy未矢量化的代码总是比裸python代码慢,并且可以说就像用手提钻破解单个核桃一样“错误”。要么找到合适的工具,要么获得更多的坚果。


推荐阅读