0

私はPythonを初めて使用し、Project Eulerの問題をいじって、その間に何か具体的なことをすることにしました。

さまざまなソリューションのタイミングを計って、それらが互いにどのように評価されるかを確認するというアイデアに出くわしました。しかし、その単純な作業は、私の好みには複雑すぎることが判明しました。time.clock()Unix システムでは呼び出しが十分に正確ではないことを読みました (秒単位の解像度は、最新のプロセッサでは単に哀れです)。したがってtimeit、プロファイリングタスクの最初の選択肢と思われるモジュールに出くわしました。

なぜ彼らがそのような直観に反する方法をとったのか、私には本当に理解できないと言わざるを得ません。コードを書き直したり再構築したりする必要がなければ、それを機能させることができないようです。これは非常にイライラします。

以下のコードを見てください。きれいでもなく、特に効率的でもありません。

import math
import sys
from timeit import Timer

def digitsum(number):
    rem = 0 
    while number > 0:
        rem += number % 10
        number //= 10
    return rem

def prime_form(p):
    if p == 2 or p == 3 or p == 5:
        return True
    elif (p-1) % 6 != 0 and (p+1) % 6 != 0:
        return False
    elif digitsum(p) % 3 == 0: 
        return False
    elif p % 10 == 0 or p % 10 == 5:
        return False
    else:
        return True

def lfactor(n):

    if n <= 3:
        return 1

    limit = int(math.sqrt(n))
    if limit % 2 == 0:
        limit -= 1

    lfac = 1
    for i in range(3,limit+1,2):
        if prime_form(i):
            (div,rem) = divmod(n,i)
            if rem == 0:
                lfac = max(lfac, max(lfactor(div) ,lfactor(i)))

    return lfac if lfac != 1 else n

number = int(sys.argv[1])
t = Timer("""print lfactor(number)""", """import primefacs""")
t.timeit(100)
#print lfactor(number)

行の時間を計りたい場合、print lfactor(number)なぜ一連のループを通過する必要があるのか​​ 、setupステートメントなどを定義しようとしている..テスト対象のコードから切り離されたデバッグツールが必要な理由を理解しています(単体テスト) ) しかし、手間をかけずに (セットアップのインポート/定義など) コードのチャンクの処理時間を取得する簡単で簡単な方法があるべきではありませんか? ここで私が考えているのは、次のような方法です。

long t0 = System.currentTimeInMillis();
// do something
long t = System.currentTimeInMillis() - t0;

.. tic/toc コマンドを使用して、MATLAB を使用するとさらに効果的です。

tic
x = A\b;
t(n) = toc;

これが暴言に出くわさないことを願っています。私は本当に「パイソンの考え方」を理解しようとしていますが、正直なところ、ここでは自然に理解できません...

4

2 に答える 2