Python Numpy比纯C快?

Python Numpy比纯C快?,python,c,performance,numpy,time,Python,C,Performance,Numpy,Time,我有下面的C代码。在我的机器上,我用13秒左右的时间来计时 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { clock_t begin = clock(); double d = 0; for (int i = 0; i < 1e9; i++) { d = 1 + rand() * 5 > 10 ? 4

我有下面的C代码。在我的机器上,我用13秒左右的时间来计时

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    clock_t begin = clock();

    double d = 0;

    for (int i = 0; i < 1e9; i++) {
        d = 1 + rand() * 5 > 10 ? 4 : rand();
    }

    clock_t end = clock();
    double time_spent = (double) (end - begin) / CLOCKS_PER_SEC;

    printf("%f", time_spent);
    return EXIT_SUCCESS;
}

考虑到他们所做的工作量相同(1e9操作),这怎么可能呢?numpy正在并行化吗

>NUMPY有多种语言的后端,如C、C++和FORTRAN,如< < /P> 随着数字技术的成熟和发展,人们已经能够 直接用NumPy编写更多代码。这段代码通常足够快 用于生产用途,但仍有一些时候需要 访问编译的代码。要么是为了提高最后一点效率 该算法或使其更容易访问广泛可用的代码 用C/C++或Fortran编写)


因此,除非您编写的是高度优化的C代码,否则它很可能会慢一些

您的pragram不会这样做。您的
C
程序调用
rand
至少
10^9次。另外,你的随机数也有条件

numpy
创建2个
1000x1000
阵列,该阵列仅为
2x10^6
。对随机值没有条件。点积然后添加
O(n^3)
操作(和数组创建),但非常优化

因此,您基本上是将
C
中的顺序
rand
调用与更少的
randn
调用以及python中的优化操作(
dot
)进行比较


为了有一个有效的基准测试,您应该有两个执行完全相同操作的程序。

您运行的是什么操作系统?如果您在Linux上,请在运行numpy操作时从命令行运行
top
命令,并目视检查正在使用的内核数量。虽然我怀疑NoMPI在没有你明确地告诉它的情况下不使用并行性。你的C程序实际上有一个<代码>,如果在中间的,这经常会阻塞一个CPU。你正在做非常不同的操作。首先,您的Python正在生成2e6伪随机数;您的C代码,除了这两个代码所做的乘法和求和之外,至少还有1e9。你宁愿举起一千张纸还是一千个炮弹?为什么?千千万万不是一样吗?试着在c中执行np.random.randn(3162331623)由于循环中的条件,您正在执行10^9个以上的rand()操作。矩阵点积取O(n^3),也就是1e9。但是点沿1000的共享维度。我们有两个10^6的数组,我同意。但是圆点又增加了10^3个运算。回到10^9,您仍然在比较非常不同的操作
~10^9
rand()
调用vs
10^6
nrand()
调用加乘法/数组创建。对于真正的基准测试,您应该确保您的程序执行完全相同的操作。@Arthur-1
random
不是系统调用。请注意,这两个代码都无条件执行1e9加法和1e9乘法。cca 2e9
rand
调用是最重要的s是glibc random的来源-加法、乘法和按位and(对于最简单的RNG)。
a = np.random.randn(1000, 1000)
b = np.random.randn(1000, 1000)
c = a.dot(b)