Po lekkim szoku wywołanym odkryciem jak się zachowuje Python przy składaniu stringów postanowiłem sprawdzić
jak inne wersje Pythona sobie radzą. Przetestowałem Pythona 3.2 oraz PyPy 1.7-r2 i 1.8-r1. Kod pozostał ten sam jak w pierwszej części (oprócz instrukcji print, którą musiałem dostosować do Pythona 3.2), do Pythona 3.2 dołożyłem składanie stringów przy użyciu format().
Wyniki mnie nie zaskoczyły bo spodziewałem się wszystkiego a przede wszystkim, że pypy zmiecie pythona. A oto one, Python 2.7 został umieszczony tylko dla porównania jak się zmieniają czasy dla poszczególnych wersji.
$ python2.7 timeit_string_format.py + , [1.085777997970581, 1.028688907623291, 1.0265541076660156] % , [1.659928798675537, 1.6647131443023682, 1.6848421096801758] $ python3.2 timeit_string_format.py + , [1.2642889022827148, 1.3161091804504395, 1.2756080627441406] % , [1.154999017715454, 1.201200008392334, 1.1763830184936523] format , [2.1013739109039307, 1.9700350761413574, 1.9505469799041748] $ pypy-c1.7 timeit_string_format.py + , [0.008589029312133789, 0.0017871856689453125, 0.0018048286437988281] % , [0.14042305946350098, 0.13074803352355957, 0.1352391242980957] $ pypy-c1.8 timeit_string_format.py + , [0.01731586456298828, 0.004745960235595703, 0.0049970149993896484] % , [0.15033602714538574, 0.12151813507080078, 0.13396596908569336]
Wersja 3.2 przyspieszyła przy składaniu stringów używając % ale znowu łączenie + zwolniło. No a pypy po prostu śmiga. Wyniki ładnie dosyć obrazują „rozgrzewanie” maszyny wirtualnej, pierwszy wynik dla obu wersji pypy odstaje dosyć wyraźnie od pozostałych. Dziwi mnie spadek wydajności wersji 1.8, nie wiem czy powinienem to zgłosić. Programiści podczas prezentacji na PyConie mówili, że jeśli coś jest wolniej to jest to błąd.
To tylko ciekawostka bo tak naprawdę liczy się przede wszystkim czytelność i tylko jeśli to naprawdę jest wąskie gardło aplikacji to można się zastanawiać nad optymalizacją.
Gwoli ścisłości. Pypy nie ma maszyny wirtualnej tylko JIT, przez co niektóre (zwykle powtarzalne) operacje szybciej się wykonują niż w cpython.
No ja nie byłbym tak do końca pewny. Dokumentacja mówi coś innego ale ten wpis jest zbyt skromny. Wygląda jak niekompletny.