【发布时间】:2016-02-21 08:41:06
【问题描述】:
所有代码都在 linux 上的同一台机器上运行。
在python中:
import numpy as np
drr = abs(np.random.randn(100000,50))
%timeit np.log2(drr)
10 个循环,3 个循环中的最佳:每个循环 77.9 毫秒
在 C++ 中(使用 g++ -o log ./log.cpp -std=c++11 -O3 编译):
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <ctime>
int main()
{
std::mt19937 e2(0);
std::normal_distribution<> dist(0, 1);
const int n_seq = 100000;
const int l_seq = 50;
static double x[n_seq][l_seq];
for (int n = 0;n < n_seq; ++n) {
for (int k = 0; k < l_seq; ++k) {
x[n][k] = abs(dist(e2));
if(x[n][k] <= 0)
x[n][k] = 0.1;
}
}
clock_t begin = clock();
for (int n = 0; n < n_seq; ++n) {
for (int k = 0; k < l_seq; ++k) {
x[n][k] = std::log2(x[n][k]);
}
}
clock_t end = clock();
在 60 毫秒内运行
在 MATLAB 中:
abr = abs(randn(100000,50));
tic;abr=log2(abr);toc
经过的时间是 7.8 毫秒。
我可以理解 C++ 和 numpy 之间的速度差异,但 MATLAB 胜过一切。 我遇到过 http://fastapprox.googlecode.com/svn/trunk/fastapprox/src/fastonebigheader.h 但这只是浮动,而不是双精度,我不确定如何将其转换为双精度。
我也试过这个: http://hackage.haskell.org/package/approximate-0.2.2.1/src/cbits/fast.c 它具有快速的日志功能,当编译为 numpy ufunc 时,运行时间为 20 毫秒,这很棒,但准确性的损失很大。
关于如何实现 MATLAB 获得的神奇 log2 速度的任何想法?
更新
感谢大家的 cmets,这非常快速且非常有帮助!实际上,答案是并行化,即将负载分散到多个线程上。根据@morningsun 的建议,
%timeit numexpr.evaluate('log(drr)')
给出 5.6 毫秒,与 MATLAB 相当,谢谢! numexpr 已启用 MKL
【问题讨论】:
标签: python c++ matlab math numpy