数値の素因数を見つけるプログラムを作成しました。入力として大きな数値(600851475143)を指定すると、MemoryError
がポップアップします。コードは次のとおりです。
def fact(a): factors = [] for i in range(1,a+1): if a%i == 0: factors.append(i) return factors num = raw_input(">> ") #600851475143 a = b = [] a = fact(long(num)) for i in range(0,len(a)): b = fact(a[i]) if len(b) <= 2: print a[i]
ブラウジングから、Pythonがコンピューターメモリ(RAM)を使用していることがわかりました。構成を変更せずにUnbuntuでPythonを使用しています。 64ビットマシンで動作するようにanythigを変更する必要があります。または、このエラーを回避するために追加の関数を使用する必要があります
コメント
回答
プログラムで使用されるメモリを測定するにはさまざまな方法があり、増やすことができる場合がありますユーザーごとの制限など。
ただし、すべてを保存せずにシーケンスを生成できるため、最初からそのメモリを割り当てる必要はありません。
def fact(a): "just return a generator for the sequence you want" return (i for i in xrange(1,a+1) if a % i == 0)
シーケンスに繰り返しインデックスを付けることなく、シーケンスを直接繰り返すこともできることに注意してください:
for b in fact(long(num)): print b
コメント
- 質問のリストは2.2TBの大きさですが、リソース制限を引き上げても役立つとは思えません:-D
- まあ、OPは2035年まで待つことができるかもしれません。 8TBのSIMMSが利用可能です。
range(1, a+1)
は600851475143要素を含むリストを作成しようとしています。各要素は整数であり、各整数は4バイトを使用するため、これはおそらくあなたが望むものではありません。 (また、この質問は'プログラマーには適切ではありません。コードレビューが本当に必要であり、特にPythonがどのように機能するかを理解する必要があるからです。)xrange
は、必要に応じて要素をfor
ループに返すジェネレーターです。ただし、問題が発生しているのはそれだけではない可能性があります。 。)