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
198
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
Voitaisko olla kavereita?
Haluaisin aloittaa puhtaalta pöydältä sinun kanssasi, tabula rasa. Minä lopetan sinun perääsi haikailun, ja sitten sinäk244172Deodoranttiteollisuus
Annan ilmaisen vinkin. Kyseinen teollisuus voisi alkaa valmistaa kuolleen ruumiin hajua. Olisi varma hittituote, ainakin132938Rukoilimme Länsimuurilla 2000 vuoden jälkeen, Jumalamme oli antanut meille kaiken takaisin
Western Wall, In our Hands. 55th Para. https://www.youtube.com/watch?v=u4BJAppyCSo https://en.wikipedia.org/wiki/55th_111223Oulaisten kaupunki tuomittiin maksamaan korvauksia
Mikäs juttu tämä on? Kaupunki syyllistänyt useamman vuoden koneyrittäjiä ja nyt tuomittu.22910Kerro kaivattusi
Jokin tapa/piirre mikä sinua viehättää ja mistä hän voisi myös tunnistaa itsensä.40888PURRA TULEE !
Valtiovarainministeri Riika Purra, joka on lisäksi varapääministeri ja perussuomalaisten puheenjohtaja, tulee puoluesiht117753- 37734
Onko MOT tulossa Ähtärin valtuuston kokoukseen?
Esityslistan mukaan Ähtärin kaupunginvaltuuston valtapuolueet aikovat maanantaina estää tilintarkastajan laatiman raport37725- 104667
- 135657