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

254

    Vastaukset

    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. Miksi et irrota otettasi

      Suhteeni?
      Ikävä
      104
      3364
    2. Koko ajan olet

      Senkin suhteen kiusannut. Halut on ihan mielettömät olleet jo pitkään
      Ikävä
      88
      3073
    3. Tykkään susta

      Elämäni loppuun asti. Olet niin suuresti siihen vaikuttanut. Tykkäsit tai et siitä
      Ikävä
      20
      1913
    4. Muutama syy

      Sille miksi IRL kohtaaminen on hänelle vaikeaa
      Ikävä
      69
      1896
    5. Onko kaikki hyvin, iso huoli sinusta

      Miten jakselet? Onko sattunut jotain ikävää. Naiselta
      Ikävä
      38
      1847
    6. Estitkö sä minut

      Oikeasti. Haluatko, että jätän sun ajattelemisen? :3
      Ikävä
      21
      1731
    7. Onko kaivatullasi

      Hyvä vai huono huumorintaju?
      Ikävä
      24
      1687
    8. Pettymys! Tähdet, tähdet -kisassa tämä erikoisjakso pois - Pistänyt artistit todella lujille!

      Tähdet, tähdet -kisa on edennyt genrestä toiseen. Mutta erästä monen toivomaa erikoisjaksoa ei tällä kaudella nähdä. Voi
      Tv-sarjat
      34
      1429
    9. Onko meillä

      Molemmilla nyt hyvät fiilikset😢ei ainakaan mulla mutta eteenpäin on mentävä😏ikävä on, kait se helpottaa ajan myötä. Ko
      Ikävä
      9
      1339
    10. Tiedätkö tykkääkö

      Kaivatustasi siinä mielessä joku muukin kuin sinä itse
      Ikävä
      48
      1337
    Aihe