2013-03-08 16 views
11

問題の同じセットを解決するには、次のコードを見てください:問題を言えば、目的を助けてくれるとは思わない、Josephus problemの別の繰り返し:どのようにこれらのPythonコードは、まったく異なった動作をしますか

解決方法1:

import sys 
from math import log 

cases= int(sys.stdin.readline()) 
current= 0 
while current < cases: 
    current += 1 
    n = int(sys.stdin.readline()) 
    print 2*(n - 2**(int(log(n,2))))+1 

このソリューションでは、累積1.0912秒で与えられた10のテストケースを解決し、メモリの4360KiBを消費します。

解決策2:

def josephus_2(n): 
    from math import log 
    return 2*(n - 2**(int(log(n,2))))+1 

import sys 
cases= int(sys.stdin.readline()) 
current= 0 
while current < cases: 
    current += 1 
    n = int(sys.stdin.readline()) 
    print josephus_2(n) 

この溶液は1.0497秒とメモリの640KiBの合計で同じ10のテストケースを解決します。

オンライン裁判官によれば、私は両方の点で同じ点を獲得していますが、解決策2は1よりも速く、より多くのメモリを効率的にする理由は何ですか?私も速く、私は私ということを覚えて私の昔の経験でC/C++/perlの提出

Can this Screenshot help?

+0

あなたはこの自分をテストすることができます方法はありますか?最初の方法は私にとってずっと速いです。 – Blender

+0

複雑な関数が独自のメソッドに分離されていると、JITingがより簡単になるかもしれません。ちょうど推測 – Patashu

+0

サンプルファイルがありますか? – Ivo

答えて

1

よりも、時間差は非常に小さい音できることを知っているが、同時に最速のソリューションに最初に私をランク付け関数(メソッド)で計算部品を置くことはいつか性能を向上させることができることを発見した:
私は次の簡単なコードを使用して再経験:

n = 1000000 
def compute(n): 
    j = 0 
    for i in xrange(n): 
     j += 1 

tic() 
compute(n) 
toc() 

>>> 0.271 s 

tic() 
j = 0 
for i in xrange(n): 
    j += 1 
toc() 

>>> 0.849 s 

結果が(計算を使用して)最初のため0.271sを示しているがインラインコードとして0.849s。これは、メイン演算部で何も変更せずに目立つ改善です! したがって、パフォーマンスを向上させる方法を使用している点があります。ここで

を使用すると、性能比較のために使用することができますコードです:

from __future__ import division 
from time import clock 

def compute(n): 
    j = 0 
    for i in xrange(n): 
     j += 1 

n = 1000000 
print 'solution (2) using a method call...' 
t0 = clock() 
compute(n) 
print clock()-t0 
#>>> ~0.2415...        #faster (solution 2) 

print 'solution (1) all inline code...' 
t0 = clock() 
j = 0 
for i in xrange(n): 
    j += 1 
print clock()-t0 
#>>> ~0.6169...        #slower (solution 1) 
+0

私のケースでは、それは他の方法であると思う... :) – whizzzkid

+0

@whizzzkidしかし、あなたの質問では、方法を使わない最初の解決策は1.0912秒かかりましたが、方法を使用する2番目の解決策はわずか1.0497秒でした。これは、あなたのケースで改善されたメソッドを0.0415秒保存することを意味します。だから私の答えを使用して説明されている方法は、パフォーマンスを向上させます。私の答えでは、最初にメソッド(つまり、2番目のソリューション)を使用しています。 – Developer

+0

私はあなたのコードを['timeit'](http://docs.python.org/2/library/timeit)を使って試しました。html)と同様の結果を得ました( 'repeat = 7、number = 10'と適切な' stmt'と 'setup'文字列で' repeat'メソッドの 'min'を使います)。 –

関連する問題