3

私は Python (私は完全な初心者です) のプログラムで計算からのデータを保存せず、保存する必要があると感じたときに何度も何度も実行するという問題を抱え続けています。プログラムを何度も計算しないように、Pythonに答えを保存させるにはどうすればよいですか?

元:

import prime
def g(x):
    i=0
    while i<len(prime.sieve(x)):
        print str(prime.sieve(x)[i])+' is prime'
        i=i+1

誰かがこれをコンパイルしたい場合の「プライム」モジュールは次のとおりです。

def sieve(max):
    #Takes in a number, and returns all primes between 2 and that number

    #Start with all of the numbers
    primes = range(2,max+1)
    #Start running through each number 
    for i in primes:
            #Start with double the number, and
            j = 2
            #remove all multiples
            while i * j <= primes[-1]:
                    #As long as the current multiple of the number
                    #is less than than the last element in the list
                    #If the multiple is in the list, take it out
                    if i * j in primes:
                            primes.remove(i*j)
                    j=j+1
    return primes

とにかく、コードの最初のビットはリスト「prime.sieve(x)」を何度も計算するので、印刷時に参照できるように保存したいと思います。

ありがとう!

ロフルス

4

4 に答える 4

4

これをメモ化といいます。幸いなことに、多くのメモ化デコレータがあり、そのうちの 1 つがここにあります: http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

使用例は次のとおりです。

@memoized
def fibonacci(n):
   "Return the nth fibonacci number."
   if n in (0, 1):
      return n
   return fibonacci(n-1) + fibonacci(n-2)

print fibonacci(12)

(@memoized式は、デコレータをそれに続く関数に適用します)。

于 2012-04-07T07:41:48.797 に答える
4
saved_sieve_map = {}
def saved_sieve(x):
  if x not in saved_sieve_map:
    saved_sieve_map[x] = sieve(x)
  return saved_sieve_map[x]
于 2012-04-07T07:38:27.907 に答える
0

この関数を使用して、再帰的な複雑さを取り除くことができます。

from functools import wraps
def memo(func): 
    cache = {}
    @wraps(func)
    def wrap(*args):
        if args not in cache: 
            cache[args] = func(*args)
        return cache[args] 
    return wrap

とにかく、これは私のふるいの実装であり、あなたのものよりもはるかに高速に実行されるはずです。

@memo
def sieve(end):
    import itertools
    lng = ((end/2)-1+end%2)
    sieve = [True]*(lng+1)
    for i in itertools.ifilter(lambda z: sieve[z],xrange(int(end**0.5) >> 1)):
        n=len(sieve[int((i*(i + 3) << 1) + 3): int(lng): int((i << 1) + 3)])
        sieve[int((i*(i + 3) << 1) + 3): int(lng): int((i << 1) + 3)]=[False]*n
    return sum([(x << 1) + 3 for x in itertools.compress(xrange(lng),sieve)])+2
于 2012-04-07T08:03:31.327 に答える
0

ローカル変数に割り当てるだけです。

i=0
saveit = prime.sieve(x)
while i<len(saveit):
    print str(saveit[i])+' is prime'
    i=i+1

g(x)注:同じ値の で が 2 回呼び出された場合でも、ふるいを計算しますx。範囲を超えても計算を保存するバージョンについては、gキースの回答などを参照してください。

于 2012-04-07T07:40:34.163 に答える