Melkoinen ero näissä on havaittavissa joten kannattaa tiukoissa ja aikaa vievissä silmukoissa, katsoa mitä käyttää. Testaa nämä silmukat Bash Shell komentokehotteessa:
Python2.x
python2 -m timeit -s 'L = range(1000)' 'zip(*(iter(L),) * 3)'
100000 loops, best of 3: 10.7 µs (mikrosekuntia) per loop
Python3.x
python3 -m timeit -s 'L = range(1000)' 'zip(*(iter(L),) * 3)'
1000000 loops, best of 3: 0.232 µs (mikrosekuntia) per loop
Ja vielä lopuksi, vertailutulokset, tosi kovista vääntäjästä PyPy2.x ja PyPy3.x, huomaa että tässä saat näiden silmukoiden keskiarvon, kun edellisissä, sait parhaimman tuloksen.
PyPy2.x
pypy -m timeit -s 'L = range(1000)' 'zip(*(iter(L),) * 3)'
100000 loops, average of 7: 16.7 µs (mikrosekuntia)
PyPy3.x
pypy3 -m timeit -s 'L = range(1000)' 'zip(*(iter(L),) * 3)'
10000000 loops, average of 7: 0.0839 µs (mikrosekuntia)
Näiden kahden, PyPy2.x ja PyPy3 vääntäjien keskinäinen ero on huikea, ja samaa linjaa noudattelee myös Python2.x ja Python3.x keskinäinen ero. Ei kai tarvitse enää kysyä kumpaa käyttäisin.
T. Urpo
Python3.x vs. Python2.x
7
366
Vastaukset
Johtunee ainakin osittain siitä, että Python 2:ssa range antaa listan ja 3:ssa iteraattorin. Kakkosessa iteraattoriversio on nimellä xrange, kokeilepa sillä.
- Anonyymi
Taas tuo toimimaton moderointi vei vastausviestin.
Hiukan hitaammaksi osoittautui:
( range 10.7 µs ) — ( xrange 13.4 µs )Syyllinen taitaakin olla tuo zip. Sekin on muutettu Python 3:ssa siten, että se tuottaa iteraattorin. Eli tuossa koodissa sitä ei käydä läpi ollenkaan pelkästään luodaan zip objekti. Käypäs läpi se zippi molemmissa koodeissa, niin sitten ovat vertailukelpoisempia. En tiedä jos lisäisi vaan list() eteen, niin olisiko se sitten about sama asia kuin 2:n versio. Ja onko tuo läpikäyminen sitten toisaalta taas epäedullinen 2:n puolesta, sillä siinä se ensin luodaan ja sitten vielä käydään läpi?
Tämän mukaan Python 2 olisi jopa nopeampi (johtuen siitä miten kokonaisluvun tyyppi on 3:ssa muutettu(?)): https://stackoverflow.com/questions/23453133/is-there-a-reason-python-3-enumerates-slower-than-python-2
Mutta tuo kysymys kumpi on nopeampi range vai xrange (Python 2:ssa) ei näköjään olekaan ihan selvä. Minä jotenkin ajattelin, että range:ssahan tehdään kaksinkertainen työ kun ensin luodaan lista ja sitten käydään se läpi. Tässä postauksessa pohdittu asiaa: https://dev.to/guy_gold/xrange-vs-range-vs-range-kd4- Anonyymi
minkkilaukku kirjoitti:
Syyllinen taitaakin olla tuo zip. Sekin on muutettu Python 3:ssa siten, että se tuottaa iteraattorin. Eli tuossa koodissa sitä ei käydä läpi ollenkaan pelkästään luodaan zip objekti. Käypäs läpi se zippi molemmissa koodeissa, niin sitten ovat vertailukelpoisempia. En tiedä jos lisäisi vaan list() eteen, niin olisiko se sitten about sama asia kuin 2:n versio. Ja onko tuo läpikäyminen sitten toisaalta taas epäedullinen 2:n puolesta, sillä siinä se ensin luodaan ja sitten vielä käydään läpi?
Tämän mukaan Python 2 olisi jopa nopeampi (johtuen siitä miten kokonaisluvun tyyppi on 3:ssa muutettu(?)): https://stackoverflow.com/questions/23453133/is-there-a-reason-python-3-enumerates-slower-than-python-2
Mutta tuo kysymys kumpi on nopeampi range vai xrange (Python 2:ssa) ei näköjään olekaan ihan selvä. Minä jotenkin ajattelin, että range:ssahan tehdään kaksinkertainen työ kun ensin luodaan lista ja sitten käydään se läpi. Tässä postauksessa pohdittu asiaa: https://dev.to/guy_gold/xrange-vs-range-vs-range-kd4Niinpä näyttää menevän, kun testi viedään niin paljon rankemmaksi, että tuloksen valmistuminen ilmaistaan millisekunneissa, asiat muuttuu tuon range ja xrange silmukan suhteen.
python2 -m timeit -t 'list_iterator = iter(list(xrange(10 ** 7)))'
10 loops, best of 3: 156 msec per loop
python2 -m timeit -t 'list_iterator = iter(list(range(10 ** 7)))'
10 loops, best of 3: 265 msec per loop
xrange onkin nyt melkein puolet nopeampi, mutta luulen että käytännössä joutuu kokonaisuutta testaamaan erikseen, luottamatta näin saatuun tulokseen. Täytyy vielä syventyä tuohon zippiin erikseen.
- Anonyymi
Mitenkä hitossa näitä eroja pitäisi selittää, testaappa näin
python2
import timeit
timeit.timeit ('x=range(10000)')
OUT: 67.29535388946533
-
python2
import timeit
timeit.timeit ('x=xrange(10000)')
OUT: 0.10304093360900879Se johtuu siitä, että kun luodaan iteraattori, niin se ei "tee mitään", vaan vain luo objektin, joka on sitten valmis iteroimaan. Se on just se sama homma tuolla ylempänä sen zipin kanssa. Kolmosessa zip antaa iteraattorin, kakkosessa listan.
minkkilaukku kirjoitti:
Se johtuu siitä, että kun luodaan iteraattori, niin se ei "tee mitään", vaan vain luo objektin, joka on sitten valmis iteroimaan. Se on just se sama homma tuolla ylempänä sen zipin kanssa. Kolmosessa zip antaa iteraattorin, kakkosessa listan.
Testausta varten on siis tehtävä looppi, jossa iteraattori käydään oikeasti läpi:
for i in xrange(10000): pass
Myös list-funktion kutsuminen tai lista-komprehension tyyliin
[i for i in xrange(10000)]
käyttäminen käy iteraattorin läpi.
Ketjusta on poistettu 1 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
PropsApp Koodi
Haluatko ansaita ja kilpailla fiksusti samalla kun seuraat urheilua? Props tekee sen mahdolliseksi. Sovelluksessa pääset23488Persut yrittävät epätoivon vimmalla
kiertää häirintä asian https://www.iltalehti.fi/politiikka/a/5389f072-60d9-4ef8-aa7b-c11f0eda66cf jonka muut puolueet a723231"Skandaali muhii SDP:ssä" - "pelon ilmapiiri vallitsee"
Puolueen johto on vähintään vastuussa ilmapiiristä, jossa häirinnän uhrit eivät ole saaneet ääntään kuuluviin. Vyyhdin502766IL: "Kyykyttämistä, alistamista, painostamista, huutamista ja tiuskimista SDP:n
eduskuntaryhmässä." Häirintäkohu puolueen ympärillä paisuu. Iltalehden haastattelemien SDP-lähteiden mukaan eduskunta-542588Riikka runnoo: konkursseja eniten 30 vuoteen
Vuonna 2025 Suomessa haettiin konkurssiin yhteensä 3 906 yritystä. Konkurssiluku oli suurin sitten vuoden 1996.892407Taas nuoren kuolema
Vasunmäentiellä paha onnettomuus. Nuori nainen menehtyi. Niiin sydäntä riipaisevaa 😭311317Jari Sillanpää isossa leikkauksessa - Paljastaa, mitä uralle tapahtuu!
Palaako Siltsu keikoille? Artisti, ex-tangokuningas Jari Sillanpää on ollut lonkkaleikkauksessa ja kotiinpaluu on edessä211217- 961188
Raamatun kanta homoseksuaaliseen käytökseen on selvä
On oma mielipiteesi mikä tahansa on hyvä muistaa, mikä on Jumalan mielipide. Edelliset ketjut ovat tulleet täyteen joten3371063Hämmentävä muutos tv:ssä: Roope Salminen OUT, Sointu Borg IN!
Roope OUT, Sointu IN! Mitä tykkäät tästä muutoksesta? Suositun Myyrä-seikkailusarjan alusta asti juontohommissa on oll14956