私の試みは、可能な限り高速で最も読みやすいバージョンを入手できるようにすることです. そうするために、私の提案は、最初に、必要な値を生成するジェネレーターを作成することです。そして、max()
このジェネレーターで組み込み関数を実行します。これがより高速/より効率的である理由は、ジェネレーターを関数内に埋め込むこととほぼ同じです。Pythonmax()
ではローカル変数のみを使用する方がグローバル変数を使用するよりも高速です。max()
x[0][1]
vals = (abs(x[0][1]) for x in dCF3v)
print max(vals)
タイミング:
次のコードを使用して、私の回答とmgilsonsの回答の差を計りました。
import time
dCF3v = [[(1.90689635276794, -44706.76171875)], [(1.90689635276794, -44706.76171875)], [(1.90689635276794, -44706.76171875)], [(1.90689635276794, -44706.76171875)]]
def method_inbar(l):
vals = (abs(x[0][1]) for x in l)
max(vals)
def method_mgilson(l):
max(abs(x[0][1]) for x in l)
def timer(multiplier=[1,10,100,1000]):
for m in multiplier:
print "timing the speed using multiplier: %s" % m
now = time.time()
for i in range(100000):
method_inbar(dCF3v*m)
print "inbar's method: %r" % (time.time() - now)
now = time.time()
for i in range(100000):
method_mgilson(dCF3v*m)
print "mgilson's method: %r" % (time.time() - now)
timer()
これにより、より大きなデータ セットに対して毎回テストが実行されます。
>>>
timing the speed using multiplier: 1
inbar's method: 0.18899989128112793
mgilson's method: 0.192000150680542
timing the speed using multiplier: 10
inbar's method: 0.8540000915527344
mgilson's method: 0.8229999542236328
timing the speed using multiplier: 100
inbar's method: 7.287999868392944
mgilson's method: 7.45199990272522
timing the speed using multiplier: 1000
inbar's method: 71.42099976539612
mgilson's method: 77.18499994277954
ご覧のとおり、大量のデータで。より高速です。遅い唯一の理由は、vals を開始するのに時間がかかるためです。関数を何度も何度も実行するため、はるかに遅いように見えますが、これを 1 回だけ実行している場合は、小さなデータ セットでは違いを感じないはずです。ですが、大規模なデータセットでは大きな違いを感じるはずです。(わずか1000回で数秒)