Python3.x vs. Python2.x

Anonyymi

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

7

422

    Vastaukset 7

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • 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-kd4

        Niinpä 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.10304093360900879

      • 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.


      • 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

    1. Mitä tuot pöytään parisuhteessa?

      Siinäpä se kysymys on otsikossa. Mitäpä siis tuot/toisit pöytään parisuhteessa? Oletko mies vai nainen? Koetko sen mitä
      Sinkut
      347
      1317
    2. Mikä sinua ja kaivattuasi

      Yhdistää??????
      Ikävä
      54
      773
    3. 2 km on nykyään liian pitkä koulumatka

      Hesarissa päivitellään lapset joutuu nyt kulkemaan 2 km kouluun jösses. Ruostefillarilla tuo matka menee vaikka miten äk
      Lieksa
      57
      762
    4. Sinulle mies

      Kohtaamme jälleen kun on oikea aika. Sitä ei voi mikään eikä kukaan estää <3 <3
      Ikävä
      38
      735
    5. Martinan bisneksillä ei mene hyvin

      https://www.iltalehti.fi/viihdeuutiset/a/c46da6ab-340f-4790-aaa7-0865eed2336 Yrityksen konkurssihakemus on tullut kärä
      Kotimaiset julkkisjuorut
      153
      675
    6. Tiesitkö? Martina Aitolehden isäpuoli on tämä suosittu laulaja

      Martina Aitolehti on seurattu julkisuuden henkilö. Lähipiiriin mahtuu muitakin tunnettuja henkilöitä. Tiesitkö, että Ma
      Kotimaiset julkkisjuorut
      26
      651
    7. Miia Heikkinen avautui !

      Olipa hyvä kirjoitus, kiitos. Ongelmat mitkä nostat esille on todellisia ja tämä ylimielisyys totta ja se näkyy kaikessa
      Judo
      62
      637
    8. 47
      634
    9. Mitä töitä kaivattusi on tehnyt?

      😅
      Ikävä
      57
      628
    10. Voiko meidän välit

      Koskaan parantua tästä?
      Ikävä
      46
      586
    Aihe