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
371
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
Hallitus pyrkii rajoittamaan kaupan omien halpamerkkien myyntiä
Helsingin Sanomien mukaan hallitus valmistelee lakihanketta, joka suitsii kaupan valtaa ja rajoittaa omien halpamerkkien1142554- 2282035
Huomenna sähkö maksaa jo yli 60 snt/kWh. Milloin ALV putoaa?
Kysynkin persuilta, että milloin aiotte pudottaa sähkön arvonlisäveron kuten Marinin hallitus teki sähkön hinnan noustes1831828- 491595
Persut päättivät hiilivoimaloiden alasajosta
Persut ovat Suomen kansan vastainen putinistiporukka, josta nyt maksamme kovaa hintaa.1041376Muistattekos kuinka kokoomus ja persut vinkuivat sähkön hinnasta?
Oppositiossa vuonna 2022, kun sähkön hinta uhkasi nousta 20 senttiin kilowattitunnilta? Nyt ovat hiiren hiljaa, kun pitä491314- 1221148
Onko jollekin vielä epäselvää Raamatun kanta homoseksuaaliseen käytökseen?
😺 On oma mielipiteesi mikä tahansa on hyvä muistaa, mikä on Jumalan mielipide. Edelliset ketjut ovat tulleet täyteen jo282907Mietin sua liikaa
Mietin nytkin sitä, että millaista se olisi tulla kotiin, kun sinä olisit täällä vastassa. Tai niin päin, että sinä tuli65815Vanhemmassa miehessä
on sellaista elämän mukana tullutta viehättävää charmia. Hän paranee iän myötä niinkuin hyvä viini tai juusto! Tuli tuo64769