脾气暴躁比纯C快?

时间:2018-11-28 07:08:55

标签: 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 : rand();
    }

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

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

但是,这种麻木的操作,我的时钟只有几分之一秒!

a = np.random.randn(1000, 1000)
b = np.random.randn(1000, 1000)
c = a.dot(b)

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

2 个答案:

答案 0 :(得分:6)

您的语法不一样。您的C程序至少调用rand {em> 10^9次。另外,您的随机条件也有条件。

numpy创建2个1000x1000数组。随机值无条件。然后,点积会添加2x10^6操作(以及创建数组),但是操作非常优化。

因此,您基本上将O(n^3)中的连续rand调用与更少的C调用以及python中的优化操作(randn)进行比较。

要获得有效的基准,您应该有2个程序执行完全相同的操作。

答案 1 :(得分:-4)

Numpy具有on their docs所列的多种语言的后端,例如C,C ++和Fortran。

  

随着Numeric的成熟和发展成为NumPy,人们已经能够   直接在NumPy中编写更多代码。通常,此代码足够快   供生产使用,但有时仍然需要   访问已编译的代码。要么从效率中获得最后一点   算法或使其更易于访问广泛可用的代码   用C / C ++或Fortran编写)

因此,除非您编写高度优化的C代码,否则它的运行速度会变慢