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

227

    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. Mies, miksi et vaikuta halukkaalta?

      Ihmeellistä käytöstä mieheltä. Toki et ole mikään teinipoika enää.
      Ikävä
      103
      1687
    2. 210
      1527
    3. Ikävä on häntä

      Josta on tullut niin tärkeä ja rakas. Olisinko onnellinen hänen kanssaan. Ne rakastavat silmät jotka mua katsoo aina jos
      Ikävä
      59
      1010
    4. Minkä kultakimpaleen

      Menetän jos en saa häntä. Joku muu saisi nauttia siitä hellyydestä, huumorista ja intohimosta. Ehkä hän ymmärtää nyt mik
      Ikävä
      31
      1000
    5. Terveystalon lääkärit ylilaskuttaneet

      Tämän pörriäiset osaavat, laskuttamisen. Terveystalo myöntää asian. https://www.hs.fi/suomi/art-2000011134269.html "K
      Maailman menoa
      58
      845
    6. En kai koskaan saa sinua

      Koska et usko että riitäisit minulle. Olet aina pitänyt itseäsi liian risana ja heikkona. Katkot korkeutesi, ja poraat k
      Ikävä
      51
      794
    7. Helppo selvittää onko oma täällä

      Laittaa yhden selvän kysymyksen ja jos kukaan ei osaa vastata, niin oikea ei ole täällä. Saa käyttää vapaasti hyödykse
      Ikävä
      49
      775
    8. Kerroppas nyt

      M mies, että kenestä sinä oikein tykkäät, niin saadaan tämä asia muillekin selväksi 😉
      Ikävä
      58
      725
    9. Tykkäsit nainen

      Aina eniten lähetyssaarnaajassa, muistan miten nautit!😎😚 meidän pitää päästä vielä kokemaan se.
      Ikävä
      36
      725
    10. The Summit Suomi: Maxie avaa hyytävästä tilanteesta kuvauksissa: "Veri roiskui ja tajusi, että..."

      Oletko seurannut The Summit Suomea? Tykkäätkö vai et tai mitä mieltä ylipäätään olet sarjasta? Moni katsoja on kaikonnut
      Tv-sarjat
      5
      722
    Aihe