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
253
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
Tänään pyörit ajatuksissa enemmän, kun erehdyin lukemaan palstaa
En saisi, silti toivon että sinä vielä palaat ja otetaan oikeasti selvää, hioituuko särmät ja sulaudummeko yhteen. Vuod224554- 203685
Seiska: Anne Kukkohovi myy pikkuhousujaan ja antaa penisarvioita
Melko hupaisaa: https://www.seiska.fi/vain-seiskassa/ex-huippumalli-anne-kukkohovin-amerikan-valloitus-vastatuulessa-myy4052417- 272121
- 342014
Nainen, sellaista tässä ajattelin
Minulla on olo, että täällä on edelleen joku, jolla on jotain käsiteltävää. Hän ei ole päässyt lähtemään vielä vaan jost2391969- 351784
- 151698
En ole koskaan kokenut
Ennen mitään tällaista rakastumista. Tiedän että kaipaan sinua varmaan loppu elämän. Toivottavasti ei tarvitsisi vain ka191497- 121351