Laufzeiten für "Liste erstellen"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
miracle173
User
Beiträge: 127
Registriert: Samstag 6. Februar 2016, 00:28

Ich habe mal versucht, die Verfahren zum Erstellen einer Liste, die im Thread Liste erstellen vorgeschlagen wurden, auszuprobieren. Die kompliziertesten Statements waren nicht unbedingt die schnellsten.

Legende:
Die erste Tabelle zeigt die erzeugte Liste und den Verfahrensnamen.
Die anderen Tablellen Zeigen den Verfahrensnamen und die von timeit gemessene Zeit in Sekunden und sind geordnet nach der Zeit.
number: number of iteration in timeit statement
der Name des Verfahrens ist username_ddHHMM, wobei ddHHMM Tag, Stunde und Minute des Eintrags ist, in dem er veröffentlicht wurde.
In Dav1d_182334 wurde izip durch zip ersetzt, da ich izip in Python 3.5 nicht finden konnte. Bei einigen Ausdrücken wurde noch mit list(statement) aus dem Objekt eine Liste erzeugt.

Python: 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)]
OS: Windows 7 Enterprise, Servicepack 1, 64 Bit
Hardware: Intel® Core™ i7-2640M Processor , 2.80GHz, 8GB Hauptspeicher

Code: Alles auswählen

test: y=3, x=7
[0, 0, 1, 0, 0, 1, 0] bwbg_182338
[0, 0, 1, 0, 0, 1, 0] Dav1d_182334
[0, 0, 1, 0, 0, 1, 0] miracle173_202027_1
[0, 0, 1, 0, 0, 1] Dav1d_182320
[0, 0, 1, 0, 0, 1, 0] snafu_182202
[0, 0, 1, 0, 0, 1, 0] snafu_181957
[0, 0, 1, 0, 0, 1, 0] Dav1d_181950
[0, 0, 1, 0, 0, 1, 0] miracle173_202027_2
[0, 0, 1, 0, 0, 1, 0] bwbg_182126
[0, 0, 1, 0, 0, 1, 0] mutetella_181721


y= 3, x= 15, number= 100000
miracle173_202027_2          0.08149
miracle173_202027_1          0.09124
snafu_182202                 0.16363
Dav1d_182320                 0.18929
Dav1d_182334                 0.24667
snafu_181957                 0.26319
mutetella_181721             0.35241
Dav1d_181950                 0.39237
bwbg_182338                  0.41221
bwbg_182126                  0.70922

y= 3, x= 15000, number= 1000
miracle173_202027_2          0.08972
miracle173_202027_1          0.11269
snafu_182202                 0.34821
Dav1d_182320                 0.40508
Dav1d_182334                 0.59858
snafu_181957                 1.82742
Dav1d_181950                 2.62524
mutetella_181721             2.69560
bwbg_182338                  2.80531
bwbg_182126                  4.14226

y= 30, x= 15000, number= 1000
miracle173_202027_1          0.12555
miracle173_202027_2          0.12678
Dav1d_182320                 0.18892
snafu_182202                 0.23194
Dav1d_182334                 0.33664
snafu_181957                 1.86588
bwbg_182338                  2.58252
mutetella_181721             2.58951
Dav1d_181950                 2.60893
bwbg_182126                  4.21309

y= 30, x= 1500000, number= 10
miracle173_202027_2          0.20204
miracle173_202027_1          0.20374
Dav1d_182320                 0.56383
snafu_182202                 0.61003
Dav1d_182334                 0.70914
snafu_181957                 2.18486
bwbg_182338                  2.75590
Dav1d_181950                 2.95452
mutetella_181721             3.06151
bwbg_182126                  4.64647

Hier ist das Testskript

Code: Alles auswählen

import timeit, itertools; from itertools import cycle, islice

code={
'mutetella_181721': '[e + (0 if i % y else 1) for i, e in enumerate([0] * x, 1)]',
'Dav1d_181950': 'list(((0 if i % y else 1) for i, _ in enumerate(itertools.repeat(0, x), 1)))', #list
'snafu_181957': '[(0 if i % y else 1) for i in range(1, x + 1)]',
'bwbg_182126': 'list((lambda n, xs: (e for _, e in zip(range(n), xs)))(x, (lambda t: ((0 if i % t else 1) for i in itertools.count(1)))(y)))', 
'snafu_182202': 'list(itertools.islice(itertools.cycle([0] * (y - 1) + [1]), x))', #list
'Dav1d_182320': 'list(itertools.chain.from_iterable(itertools.repeat([0] * (y - 1) + [1], x//y)))',
'Dav1d_182334': 'list(itertools.islice(itertools.chain.from_iterable(zip(*(([itertools.repeat(0)]*(y-1)) + [itertools.repeat(1)]))), x))', # list, kein izip
'bwbg_182338': 'list(itertools.islice((lambda t: ((0 if i % t else 1) for i in itertools.count(1)))(y), 0, x))',
'miracle173_202027_1': '([0]*(y-1)+[1])*(x//y)+[0]*(x%y)',
'miracle173_202027_2': '(([0]*(y-1)+[1])*-(-x//y))[:x]',
}


def test_functions(y,x,number):
    measurement=[[timeit.timeit(code[k],'x='+str(x)+';y='+str(y),number=number),k] for k in code]
    print()
    print('y= %d, x= %d, number= %d'%(y,x,number))
    for pair in sorted(measurement):
        print('%-25s %10.5f'%(pair[1],pair[0]))

y=3
x=7
print('test: y=%d, x=%d'%(y,x))
for k in code:
    z=eval(code[k])
    print(z,k)

print()


test_functions(3,15,100000)
test_functions(3,15000,1000)
test_functions(30,15000,1000)
test_functions(30,1500000,10)
 
Ist es auf einfache Weise möglich, den Memory-Verbrauch eine Statements zu ermitteln?
Zuletzt geändert von miracle173 am Montag 21. März 2016, 12:42, insgesamt 2-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du hast vergessen, die Ergebnisse reinzuschreiben.

EDIT: Ach nee, ich hatte vergessen, zu scrollen... :oops:
Antworten