Kodunuzu Zamanlamak için Python Timeit'i Kullanma

Yayınlanan: 2023-01-17

Bu öğreticide, Python'un timeit modülünden timeit işlevini nasıl kullanacağınızı öğreneceksiniz. Python'da basit ifadelerin ve işlevlerin nasıl zamanlanacağını öğreneceksiniz.

Kodunuzu zamanlamak, bir kod parçasının yürütme süresi hakkında bir tahminde bulunmanıza ve ayrıca kodun optimize edilmesi gereken bölümlerini belirlemenize yardımcı olabilir.

Python'un timeit fonksiyonunun sözdizimini öğrenerek başlayacağız. Ardından, Python modülünüzdeki kod bloklarını ve işlevleri zamanlamak için nasıl kullanılacağını anlamak için örnekleri kodlayacağız. Hadi başlayalım.

Python timeit İşlevi Nasıl Kullanılır?

timeit modülü, Python standart kitaplığının bir parçasıdır ve onu içe aktarabilirsiniz:

 import timeit

timeit modülünden timeit işlevini kullanmak için sözdizimi aşağıda gösterildiği gibidir:

 timeit.timeit(stmt, setup, number)

Burada:

  • stmt , yürütme süresi ölçülecek olan kod parçasıdır. Bunu basit bir Python dizesi veya çok satırlı bir dize olarak belirtebilir veya çağrılabilir adını iletebilirsiniz.
  • Adından da anlaşılacağı gibi setup , genellikle stmt çalışması için bir ön koşul olarak yalnızca bir kez çalıştırılması gereken kod parçasını belirtir. Örneğin, bir NumPy dizisinin oluşturulması için yürütme süresini hesapladığınızı varsayalım. Bu durumda, içe aktarma numpy setup kodudur ve gerçek oluşturma, zamanlanacak ifadedir.
  • Parametre number , stmt kaç kez çalıştırıldığını gösterir. number varsayılan değeri 1 milyondur (1000000), ancak bu parametreyi istediğiniz başka bir değere de ayarlayabilirsiniz.

Artık timeit() işlevini kullanmanın sözdizimini öğrendiğimize göre, bazı örnekleri kodlamaya başlayalım.

Basit Python İfadelerini Zamanlama

Zamanlama-Basit-Python-İfadeleri

Bu bölümde timeit kullanarak basit Python ifadelerinin yürütme süresini ölçmeye çalışacağız.

Bir Python REPL başlatın ve aşağıdaki kod örneklerini çalıştırın. Burada, 10000 ve 100000 çalıştırma için üs alma ve kat bölme işlemlerinin yürütme süresini hesaplıyoruz.

Zamanlanacak ifadeyi bir Python dizesi olarak ilettiğimize ve ifadedeki farklı ifadeleri ayırmak için noktalı virgül kullandığımıza dikkat edin.

 >>> import timeit >>> timeit.timeit('3**4;3//4',number=10000) 0.0004020999999738706 >>> timeit.timeit('3**4;3//4',number=100000) 0.0013780000000451764

Python timeit'i Komut Satırında Çalıştırma

timeit komut satırında da kullanabilirsiniz. İşte timeit işlev çağrısının komut satırı eşdeğeri:

 $ python-m timeit -n [number] -s [setup] [stmt]
  • python -m timeit , timeit ana modül olarak çalıştırdığımızı gösterir.
  • n , kodun kaç kez çalıştırılacağını gösteren bir komut satırı seçeneğidir. Bu, timeit() işlev çağrısındaki number bağımsız değişkenine eşdeğerdir.
  • Kurulum kodunu tanımlamak için -s seçeneğini kullanabilirsiniz.

Burada, komut satırı eşdeğerini kullanarak önceki örneği yeniden yazıyoruz:

 $ python -m timeit -n 100000 '3**4;3//4' 100000 loops, best of 5: 35.8 nsec per loop

Bu örnekte, yerleşik len() işlevinin yürütme süresini hesaplıyoruz. Dizenin başlatılması, s seçeneği kullanılarak iletilen kurulum kodudur.

 $ python -m timeit -n 100000 -s "string_1 = 'coding'" 'len(string_1)' 100000 loops, best of 5: 239 nsec per loop

Çıktıda, en iyi 5 çalıştırma için yürütme süresini aldığımıza dikkat edin. Ne anlama geliyor? timeit komut satırında çalıştırdığınızda, repeat seçeneği r varsayılan değeri 5 olarak ayarlanır. Bu, stmt belirtilen number yürütülmesinin beş kez tekrarlandığı ve yürütme sürelerinin en iyisinin döndürüldüğü anlamına gelir.

Timeit Kullanarak Dizi Ters Çevirme Yöntemlerinin Analizi

Python dizeleriyle çalışırken bunları tersine çevirmek isteyebilirsiniz. Dize ters çevirmeye yönelik en yaygın iki yaklaşım aşağıdaki gibidir:

  • Dize dilimlemeyi kullanma
  • reversed() işlevini ve join() yöntemini kullanma
Analiz-of-Dize-Ters-Yöntemleri-Using-timeit

Dize Dilimleme Kullanarak Python Dizelerini Tersine Çevirme

Dize dilimlemenin nasıl çalıştığını ve bir Python dizesini tersine çevirmek için nasıl kullanabileceğinizi görelim. Some some-string[start:stop] sözdizimini kullanmak, dizgenin start dizininden start stop-1 dizinine kadar uzanan bir dilimini döndürür. Bir örnek alalım.

Aşağıdaki 'Python' dizesini düşünün. Dizinin uzunluğu 6'dır ve dizin listesi 0, 1, 2'den 5'e kadardır.

resim-76
 >>> string_1 = 'Python'

Hem start ​​hem de stop değerlerini belirttiğinizde, start stop-1 uzanan bir dize dilimi elde edersiniz. Bu nedenle string_1[1:4] , 'yth' değerini döndürür.

resim-77
 >>> string_1 = 'Python' >>> string_1[1:4] 'yth'

start ​​değerini belirtmediğinizde, varsayılan start ​​değeri olan sıfır kullanılır ve dilim sıfır dizinde başlar ve stop - 1 kadar uzanır.

resim-78

Burada stop değeri 3 olduğu için dilim index 0'dan başlar ve index 2'ye kadar gider.

 >>> string_1[:3] 'Pyt'

stop indeksini eklemediğinizde dilimin start indeksinden (1) başladığını ve string sonuna kadar uzandığını görürsünüz.

resim-80
 >>> string_1[1:] 'ython'

Hem start ​​hem de stop değerlerinin yok sayılması, tüm dizenin bir dilimini döndürür.

resim-81
 >>> string_1[::] 'Python'

step değeri ile bir dilim oluşturalım. start , stop ve step değerlerini sırasıyla 1, 5 ve 2 olarak ayarlayın. 1'den başlayıp 4'e kadar uzanan (bitiş noktası 5 hariç) her ikinci karakteri içeren bir dize dilimi alırız.

resim-82
 >>> string_1[1:5:2] 'yh'

Negatif bir adım kullandığınızda, dizenin sonunda başlayan bir dilim elde edebilirsiniz. Adım -2 olarak ayarlandığında, string_1[5:2:-2] aşağıdaki dilimi verir:

resim-83
 >>> string_1[5:2:-2] 'nh'

Dizinin ters bir kopyasını elde etmek için start ​​ve stop değerlerini atlıyoruz ve gösterildiği gibi adımı -1 olarak ayarlıyoruz:

 >>> string_1[::-1] 'nohtyP'

Özetle: string[::-1] , dizenin ters bir kopyasını döndürür.

Dizeleri Yerleşik İşlevleri ve Dize Yöntemlerini Kullanarak Ters Çevirme

Python'daki yerleşik reversed() işlevi, dizenin öğeleri üzerinde bir ters yineleyici döndürür.

 >>> string_1 = 'Python' >>> reversed(string_1) <reversed object at 0x00BEAF70>

Böylece bir for döngüsü kullanarak ters yineleyicide dolaşabilirsiniz:

 for char in reversed(string_1): print(char)

Ve dizinin elemanlarına ters sırayla erişin.

 # Output n o h t y P

Ardından, ters yineleyicide join() yöntemini şu sözdizimiyle çağırabilirsiniz: <sep>.join(reversed(some-string)) .

Aşağıdaki kod parçacığı, ayırıcının sırasıyla bir tire ve bir boşluk olduğu birkaç örnek gösterir.

 >>> '-'.join(reversed(string1)) 'nohtyP' >>> ' '.join(reversed(string1)) 'nohty P'

Burada ayırıcı istemiyoruz; dizenin ters bir kopyasını almak için ayırıcıyı boş bir dizeye ayarlayın:

 >>> ''.join(reversed(string1)) 'nohtyP'

''.join(reversed(some-string)) kullanılması, dizenin ters çevrilmiş bir kopyasını döndürür.

Timeit Kullanarak Yürütme Sürelerini Karşılaştırma

Şimdiye kadar, Python dizelerini tersine çevirmek için iki yaklaşım öğrendik. Ama hangisi daha hızlı? Hadi bulalım.

Basit Python ifadelerini zamanladığımız önceki bir örnekte, herhangi bir setup kodumuz yoktu. Burada Python dizesini tersine çeviriyoruz. Dizi tersine çevirme işlemi, sayı tarafından belirtilen number çalışırken, setup kodu, yalnızca bir kez çalışacak dizenin başlatılmasıdır.

 >>> import timeit >>> timeit.timeit(stmt = 'string_1[::-1]', setup = "string_1 = 'Python'", number = 100000) 0.04951830000001678 >>> timeit.timeit(stmt = "''.join(reversed(string_1))", setup = "string_1 = 'Python'", number = 100000) 0.12858760000000302

Belirli bir diziyi tersine çevirmek için aynı sayıda çalıştırma için, dize dilimleme yaklaşımı, join() yöntemini ve reversed() işlevini kullanmaktan daha hızlıdır.

timeit Kullanarak Python İşlevlerini Zamanlama

Zamanlama-Python-Fonksiyonları-Kullanma-timeit

Bu bölümde Python fonksiyonlarının timeit fonksiyonu ile nasıl zamanlanacağını öğrenelim. Bir dize listesi verildiğinde, aşağıdaki işlev hasDigit en az bir basamak içeren dizelerin listesini döndürür.

 def hasDigit(somelist): str_with_digit = [] for string in somelist: check_char = [char.isdigit() for char in string] if any(check_char): str_with_digit.append(string) return str_with_digit

Şimdi bu Python işlevinin hasDigit() yürütme süresini timeit kullanarak ölçmek istiyoruz.

Önce zamanlanacak ifadeyi ( stmt ) tanımlayalım. Argüman olarak bir dizge listesiyle hasDigit() işlevine yapılan çağrıdır. Ardından, kurulum kodunu tanımlayalım. setup kodunun ne olması gerektiğini tahmin edebilir misiniz?

İşlev çağrısının başarıyla çalışması için kurulum kodu aşağıdakileri içermelidir:

  • hasDigit() işlevinin tanımı
  • Dizelerin bağımsız değişken listesinin başlatılması

setup dizesindeki kurulum kodunu aşağıda gösterildiği gibi tanımlayalım:

 setup = """ def hasDigit(somelist): str_with_digit = [] for string in somelist: check_char = [char.isdigit() for char in string] if any(check_char): str_with_digit.append(string) return str_with_digit thislist=['puffin3','7frost','blue'] """

Ardından, timeit işlevini kullanabilir ve hasDigit() işlevinin 100000 çalıştırma için yürütme süresini elde edebiliriz.

 import timeit timeit.timeit('hasDigit(thislist)',setup=setup,number=100000)
 # Output 0.2810094920000097

Çözüm

İfadeleri, işlevleri ve diğer çağrılabilir öğeleri zamanlamak için Python'un timeit işlevini nasıl kullanacağınızı öğrendiniz. Bu, kodunuzu karşılaştırmanıza, aynı işlevin farklı uygulamalarının yürütme sürelerini karşılaştırmanıza ve daha pek çok şeye yardımcı olabilir.

Bu eğitimde öğrendiklerimizi gözden geçirelim. timeit timeit() işlevini timeit.timeit(stmt=...,setup=...,number=...) söz dizimi ile kullanabilirsiniz. Alternatif olarak, kısa kod parçacıklarını zamanlamak için komut satırında timeit'i çalıştırabilirsiniz.

Bir sonraki adım olarak, sırasıyla zaman ve bellek için kodunuzun profilini çıkarmak üzere line-profiler ve memprofiler gibi diğer Python profil oluşturma paketlerini nasıl kullanacağınızı keşfedebilirsiniz.

Ardından, Python'da saat farkının nasıl hesaplanacağını öğrenin.