PythonのこのコードがC ++よりもはるかに高速なのはなぜですか?

ハイウェイジョン

Pythonには、次の簡単なコードがあります。

N = 10000
mu = 0.0001
iterations = 10000
l = 10

@nb.njit()
def func1(N, l, mu, iterations):
    intList = [0]*N
    for x in range(iterations):
        for number in range(N):
            for position in range(l):
                if random.random() < mu:
                    intList[number] = intList[number] ^ (1 << position)

func1(N, l, mu, iterations)

count = 1
print(timeit(lambda: func1(N, l, mu, iterations), number=count))
>>> 5.677

私はC ++に慣れていませんが、Pythonバージョンと比較してどれだけ速いかを知りたかったのです。私のPythonコードは非常に単純なので、試してみることができると思いました。Pythonコードと同等であるはずの私のC ++コードは

#include <iostream>
#include <random>

using namespace std; 

int func1(int iterations, int l, int N, float mu)
{
    std::random_device rd;  //Will be used to obtain a seed for the random number engine
    std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
    std::uniform_real_distribution<> dis(0.0, 1.0);
    std::vector<int> intList(N);

    //for (int i = 0; i < N; i++)
    //  cout << intList[i];
    //cout << "\n";
    int x, number, position;
    for (x = 0; x < iterations; x++) {
        for (number = 0; number < N; number++) {
            for (position = 0; position < l; position++) {
                if (dis(gen) < mu) {
                    intList[number] = intList[number] ^ (1 << position);
                }
            }
        }
    }
    //for (int i = 0; i < N; i++)
    //  cout << intList[i];
    return 0;
}

int main()
{   
    int N, l, iterations;
    float mu;
    N = 10000;
    mu = 0.0001;
    iterations = 10000;
    l = 10;
    func1(iterations, l, N, mu);
    cout << "\nFertig";
}

ただし、このコードには最大5〜10倍の時間がかかります。本当にびっくりしました。その説明は何ですか?

orlp

Numbaは、呼び出し独自のインライン化された内部MersenneTwister実装に内部的に変換しrandom.randomますしたがって、効果的に全体がLLVMによって効率的なコードにコンパイルされます。他の実装と同様に、C ++で記述されている可能性もあります。func1

したがって、最適化をオンにしてC ++実装をコンパイルすると、問題を再現できないのは当然のことです。両方の実装は本質的に同じです。私のマシンでは、Pythonコードは約6.1秒で実行され、C ++コードは約6.9秒で実行されます。

ただし、より速く進みたい場合は、突然変異の確率が低い遺伝子突然変異を効率的に実装したい場合は(そう思われます)、最初に確率μの二項分布生成してから、その数のインデックスを選択することをお勧めします。あなたのゲノムの長さからの置き換えなし。あるいは、ここで説明する方法です

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

配列がArrayListよりもはるかに高速なのはなぜですか?

分類Dev

any()がinよりもはるかに高速なのはなぜですか?

分類Dev

このコードでCPUがGPUよりも高速に実行されるのはなぜですか?

分類Dev

C#での計算がPythonよりもはるかに高速なのはなぜですか

分類Dev

この場合、PythonがC ++よりも高速なのはなぜですか?

分類Dev

この場合、「sed」が「awk」よりもはるかに高速でないのはなぜですか

分類Dev

「dd」をgzip経由で直接コピーするよりもはるかに高速なのはなぜですか?

分類Dev

Eigensのmean()メソッドがsum()よりもはるかに高速なのはなぜですか?

分類Dev

ifstream :: readがイテレータを使用するよりもはるかに高速なのはなぜですか?

分類Dev

ターミナルでMacVimがVimよりもはるかに高速なのはなぜですか?

分類Dev

COPYはどのように機能し、なぜINSERTよりもはるかに高速なのですか?

分類Dev

memcmpがforループチェックよりもはるかに高速なのはなぜですか?

分類Dev

ここでJavaがCよりも高速に実行されるのはなぜですか?

分類Dev

同じ目的で使用した場合、.html()が.text()よりもはるかに高速なのはなぜですか?

分類Dev

この単純なループの実行において、PHP7がPython3よりもはるかに高速なのはなぜですか?

分類Dev

str.strip()がstr.strip( '')よりもはるかに高速なのはなぜですか?

分類Dev

numpy.ndarray.Tがnumpy.transpose(numpy.ndarray)よりもはるかに高速なのはなぜですか?

分類Dev

rand()がarc4random()よりもはるかに高速なのはなぜですか?

分類Dev

pandas.grouby.meanが並列実装よりもはるかに高速なのはなぜですか

分類Dev

サブクエリ結合が直接結合よりもはるかに高速なのはなぜですか

分類Dev

fio seq_writesがddよりもはるかに高速なのはなぜですか?

分類Dev

文字列:indexOfがcontainsよりも大幅に高速なのはなぜですか?

分類Dev

SSHがHTTPよりもはるかに高速であると感じるのはなぜですか?

分類Dev

test1()がtest2()よりもはるかに高速に実行されるのはなぜですか?

分類Dev

なぜ線形検索はバイナリ検索よりもはるかに高速なのですか?

分類Dev

この操作がGPUよりもCPUで高速に実行されるのはなぜですか?

分類Dev

このjQueryコードがこれよりもはるかに遅いのはなぜですか?

分類Dev

SSRがSPAよりも高速であるのはなぜですか?

分類Dev

gcloudコマンドラインツールがブラウザのアップロードよりもはるかに高速なのはなぜですか?

Related 関連記事

  1. 1

    配列がArrayListよりもはるかに高速なのはなぜですか?

  2. 2

    any()がinよりもはるかに高速なのはなぜですか?

  3. 3

    このコードでCPUがGPUよりも高速に実行されるのはなぜですか?

  4. 4

    C#での計算がPythonよりもはるかに高速なのはなぜですか

  5. 5

    この場合、PythonがC ++よりも高速なのはなぜですか?

  6. 6

    この場合、「sed」が「awk」よりもはるかに高速でないのはなぜですか

  7. 7

    「dd」をgzip経由で直接コピーするよりもはるかに高速なのはなぜですか?

  8. 8

    Eigensのmean()メソッドがsum()よりもはるかに高速なのはなぜですか?

  9. 9

    ifstream :: readがイテレータを使用するよりもはるかに高速なのはなぜですか?

  10. 10

    ターミナルでMacVimがVimよりもはるかに高速なのはなぜですか?

  11. 11

    COPYはどのように機能し、なぜINSERTよりもはるかに高速なのですか?

  12. 12

    memcmpがforループチェックよりもはるかに高速なのはなぜですか?

  13. 13

    ここでJavaがCよりも高速に実行されるのはなぜですか?

  14. 14

    同じ目的で使用した場合、.html()が.text()よりもはるかに高速なのはなぜですか?

  15. 15

    この単純なループの実行において、PHP7がPython3よりもはるかに高速なのはなぜですか?

  16. 16

    str.strip()がstr.strip( '')よりもはるかに高速なのはなぜですか?

  17. 17

    numpy.ndarray.Tがnumpy.transpose(numpy.ndarray)よりもはるかに高速なのはなぜですか?

  18. 18

    rand()がarc4random()よりもはるかに高速なのはなぜですか?

  19. 19

    pandas.grouby.meanが並列実装よりもはるかに高速なのはなぜですか

  20. 20

    サブクエリ結合が直接結合よりもはるかに高速なのはなぜですか

  21. 21

    fio seq_writesがddよりもはるかに高速なのはなぜですか?

  22. 22

    文字列:indexOfがcontainsよりも大幅に高速なのはなぜですか?

  23. 23

    SSHがHTTPよりもはるかに高速であると感じるのはなぜですか?

  24. 24

    test1()がtest2()よりもはるかに高速に実行されるのはなぜですか?

  25. 25

    なぜ線形検索はバイナリ検索よりもはるかに高速なのですか?

  26. 26

    この操作がGPUよりもCPUで高速に実行されるのはなぜですか?

  27. 27

    このjQueryコードがこれよりもはるかに遅いのはなぜですか?

  28. 28

    SSRがSPAよりも高速であるのはなぜですか?

  29. 29

    gcloudコマンドラインツールがブラウザのアップロードよりもはるかに高速なのはなぜですか?

ホットタグ

アーカイブ