2017-12-18 20 views
5

私は1つのプログラムでたくさんの対数計算を使わなければなりません。対数ベースに関しては、手順は特定ではありません。フックの下におそらく他のすべての基底alog_a(x) = log_n(x)/log_n(a)に変換されるので、基底n(2?10?e?)がPython 3.5 mathモジュールで他のものより速いとすれば、私は疑問に思っていました。または、すべてのベースがCライブラリを使用して同じ方法で実装されるため、ベースの選択は計算の速度に影響しませんか?Pythonの対数計算の基礎は速度に影響しますか?

+1

[Pythonの数学関数はどこで調べることができますか?](https://stackoverflow.com/questions/5476189/where-can-i-inspect-pythons-math-functions) –

+0

numpyを使用していますか?または別のライブラリですか?ベクトル/ベクトル化されたメソッドを使用する関数ですか? – Jon

+0

自分でベンチマークをやろうとすることもできますが、コードによっては違いがあっても他の種類のオーバーヘッドによって大きく覆い隠される可能性があります。 – jdehesa

答えて

4

math.logはベースの独立したが、プラットフォームに依存しています。 C source for the math moduleから、1940-1961行にはmath.logのコードが表示されます。

math_log_impl(PyObject *module, PyObject *x, int group_right_1, 
      PyObject *base) 
/*[clinic end generated code: output=7b5a39e526b73fc9 input=0f62d5726cbfebbd]*/ 

{ 
    PyObject *num, *den; 
    PyObject *ans; 

    num = loghelper(x, m_log, "log"); // uses stdlib log 
    if (num == NULL || base == NULL) 
     return num; 

    den = loghelper(base, m_log, "log"); // uses stdlib log 
    if (den == NULL) { 
     Py_DECREF(num); 
     return NULL; 
    } 

    ans = PyNumber_TrueDivide(num, den); 
    Py_DECREF(num); 
    Py_DECREF(den); 
    return ans; 
} 

C log機能がeのための特別なチェックを持っていない限り、それは同じ速度で動作しますので、これは、どんな、数ベースの自然対数を計算しません。

この情報源はまた、他の答えのlog2log10logより速いことを説明しています。これらはそれぞれ標準ライブラリlog2log10の関数を使用して実装されています。これは高速になります。ただし、これらの機能はプラットフォームによって異なって定義されています。

注:私はCにあまり慣れていないので、ここで間違っている可能性があります。

+1

私はCコードを解釈する立場にいません。しかし、私はこのことから、 'log(x)、log2(x)、log10(x)'は同じCライブラリ戦略を使用するので、同じ速度を持つべきであることを理解しています。そして、 'log(x、n)'は私の質問からの対数式を使​​っているので遅いです。 – MrT

+0

はい、正しいです。 –

2

興味深い質問です。私はいくつかの "古い"フィールドテスト(Linux上のCPython 3.6.2、x86_64、i7-3740QM CPU - Pythonインタプリタをコンパイルして、このCPUが有効になっているすべての最適化をコンパイルしました)でした。

>>> math.log10(3) 
0.47712125471966244 
>>> math.log(3, 10) 
0.47712125471966244 
>>> timeit.timeit('math.log(3, 10)', setup = 'import math') 
0.2496643289923668 
>>> timeit.timeit('math.log10(3)', setup = 'import math') 
0.14756392200069968 

Log10は明らかにlog(n、10)よりも高速です。

>>> math.log2(3.0) 
1.584962500721156 
>>> math.log(3.0, 2.0) 
1.5849625007211563 
>>> timeit.timeit('math.log2(3.0)', setup = 'import math') 
0.16744944200036116 
>>> timeit.timeit('math.log(3.0, 2.0)', setup = 'import math') 
0.22228705599263776 

Log2もlog(n、2)より明らかに高速です。いずれにせよ、浮動小数点数と整数は等しく高速です。

numpyとは、画像が異なります。一種のあなたが何をするかは重要ではありません:

はCPythonで
>>> timeit.timeit('numpy.log(numpy.arange(1, 10))', setup = 'import numpy') 
2.725074506000965 
>>> timeit.timeit('numpy.log10(numpy.arange(1, 10))', setup = 'import numpy') 
2.613872367001022 
>>> timeit.timeit('numpy.log2(numpy.arange(1, 10))', setup = 'import numpy') 
2.58251854799164 
関連する問題