私はPythonで、0と1で満たされたかなり大きな配列を作成しようとしています。最終的には約12億のエントリがあるはずです。例のように記入します。背後にある考え方は、400エントリがタイムスロットであり、各タイムスロットに対してそれが1である確率pがあるということです。その場合は、slot_durationタイムスロットのエントリで埋められます。それ以外の場合は、ゼロの400エントリ(1タイムスロット)で埋められます。
import numpy as np
p = 0.01
slot_duration = 10
test_duration = 60
timeslots_left = test_duration * 1000 * 1000 / 20
transmission_array = []
while timeslots_left >= 0:
rand_num = np.random.choice((0, 1), p=[1 - p, p])
if rand_num == 1:
for i in range(0, slot_duration):
for j in range(0, 400):
transmission_array.append(1)
timeslots_left -= slot_duration
else:
for j in range(0, 400):
transmission_array.append(0)
timeslots_left -= 1
もちろんパフォーマンスはひどいです。10の期間、配列を生成するのに約45秒かかりますが、それを繰り返すだけでも45秒かかります。
私の質問は、それを行うためのよりパフォーマンスの高い方法があるかどうかです。ゼロを含む固定長の配列を初期化してから、値を1に再割り当てする方がよいでしょうか。それとも、それを繰り返すのに同じ時間がかかる場合、それは役に立ちませんか?
私はどんな提案にもオープンです。
十分なメモリがある場合は、そのループを置き換えることができます。
for i in range(0, slot_duration):
for j in range(0, 400):
transmission_array.append(1)
沿って
transmission_array.extend([1]*400*slot_duration)
Cコンパイルされた1つの命令を実行し、すべてのサイズ変更なしで、リストを1回で拡張します。このように、二重ループを回避し、内部で実行するサイズ変更/メモリコピーを大幅に削減します。
そして、slot_duration
が定数の場合、次のように宣言できます。
chunk = [1]*400*slot_duration
起動時にできるので transmission_array.extend(chunk)
したがってchunk
、各反復での割り当てを回避しています
ここで同じ問題、同じ修正:
for j in range(0, 400):
transmission_array.append(0)
になります
transmission_array.extend(zero_array)
と zero_array = [0]*400
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加