Kodunuzu Zamanlamak için Python Timeit'i Kullanma
Yayınlanan: 2023-01-17Bu öğ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
, genelliklestmt
ç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 aktarmanumpy
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
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ındakinumber
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 vejoin()
yöntemini kullanma
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.
>>> 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.
>>> 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.
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.
>>> string_1[1:] 'ython'
Hem start
hem de stop
değerlerinin yok sayılması, tüm dizenin bir dilimini döndürür.
>>> 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.
>>> 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:
>>> 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
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.