2

私はpythonが初めてで、私の問題は次のとおりです。

func(a,b)2 つの入力値を指定して、値を返す関数を定義しました。

現在、データをリストまたはnumpy配列に保存しており、すべての組み合わせA,Bに使用したいと考えています。func(A と B は 100 万件以上のエントリがあります)

ATM 私はこのスニペットを使用します:

for p in A:
  for k in B:
    value = func(p,k)

これには本当に時間がかかります。

だから私は多分このようなものだと思っていました:

C=(map(func,zip(A,B)))

しかし、この方法はペアでしか機能しません...何かアイデアはありますか?

手伝ってくれてありがとう

4

4 に答える 4

3

創刊

f多くの値のペアの出力を計算する必要があります。この種のループ (計算) を高速化する「標準的な」方法は、関数にf(NumPy) 配列を入力として受け入れさせ、配列全体で一度に計算を実行させることです (つまり、Python から見られるようなループはありません)。NumPy のチュートリアルを確認して、概要を確認してください。

第二号

ABがそれぞれ 100 万を超えるエントリを持っている場合、1 兆の組み合わせがあります。64 ビットの数値の場合、計算結果を格納するためだけに 7.3 TiB のスペースが必要になることを意味します。結果を保存するだけの十分なハード ドライブがありますか?

第三号

はるかに小さい場合AB特定のケースでは、これを行うことができます:

values = f(*meshgrid(A, B))

meshgridAとのデカルト積を返すBので、これは単に評価する必要がある点を生成する方法です。

概要

  • Python ループを回避するには、NumPy を効果的に使用する必要があります。(または、他のすべてが失敗した場合、または簡単にベクトル化できない場合は、たとえばCythonを使用して、これらのループをコンパイル済み言語で記述します)

  • テラバイト単位のデータを扱うのは大変です。それだけのデータが本当に必要ですか?

  • ループ内で関数をf1e12 回呼び出すソリューションは、特に CPython (デフォルトの Python 実装です。確信が持てず、NumPy を使用している場合は、それも使用しています) では遅くなります。

于 2012-10-30T16:21:04.527 に答える
1

100万×100万は1兆です。f1兆回の呼び出しには時間がかかります。

計算する値の数を減らす方法がない限り、上記よりもうまくいくことはできません。

于 2012-10-30T16:05:02.580 に答える
1

itertools.product が必要なことを行うとします。

from itertools import product

pro = product(A,B)
C = map(lambda x: func(*x), pro)

ジェネレーターである限り、追加のメモリは必要ありません

于 2012-10-30T16:08:56.830 に答える
1

NumPy を使用する場合はnp.vectorize、この種の問題用に設計された関数を確認する必要があります...

于 2012-10-30T16:11:34.613 に答える