सभी कोड लिनक्स पर एक ही मशीन पर चलाया गया था।फास्ट लॉगरिथम गणना
अजगर में:
import numpy as np
drr = abs(np.random.randn(100000,50))
%timeit np.log2(drr)
10 छोरों, 3 का सबसे अच्छा: पाश प्रति 77.9 एमएस
C++ (छ साथ ++ ./log.cpp लोग इन -ओ -std = C++ 11 संकलित -O3):
01,235,164: 60 एमएसMATLAB में
#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();
रन
abr = abs(randn(100000,50));
tic;abr=log2(abr);toc
बीता हुआ समय 7.8 एमएस है।
मैं सेल्सियस के बीच गति अंतर ++ और 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 को जादुई लॉग 2 गति को प्राप्त करने के तरीके पर कोई विचार है?
अद्यतन
आप सभी टिप्पणियों के लिए धन्यवाद, यह बहुत तेजी से और काफी मददगार था! दरअसल, जवाब समांतरता है, यानी कई धागे पर भार फैलाना। @morningsun सुझाव,
% timeit numexpr.evaluate ('लॉग (DRR)')
5.6 एमएस देता है, जो MATLAB के समान है के बाद, धन्यवाद! numexpr एमकेएल सक्षम है
Vectorisation और parallelisation। – IKavanagh
यह एक ठेठ [सिमड] (https://en.wikipedia.org/wiki/SIMD) परिदृश्य है। पहले सी ++ कोड पर वेक्टरेशन टेक्निक्स का अन्वेषण करें। उदाहरण के लिए, [ओपनएमपी] (http://openmp.org/wp/) आज़माएं। –
सी ++ कंपाइलर लॉग 2() कॉल को अनलॉक नहीं कर सकता है, इसलिए यह लूप इंडेक्स का ट्रैक रखने में काफी समय बिताता है। और जैसे IKavanagh कहते हैं, matlab गणना गणना समानांतर। आप आसानी से [ओपनएमपी] (http://openmp.org/wp/) के साथ ऐसा कर सकते हैं। – YSC