我有以下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并行化吗?
答案 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代码,否则它的运行速度会变慢