Python'da% timeit nedir?


97

Zamanı şu şekilde hesaplamak için her zaman kodu okurum:

%timeit function()

Burada "%" nin ne anlama geldiğini açıklayabilir misiniz?

Sanırım, "%" her zaman bir dizedeki bir şeyi değiştirmek için kullanılır, örneğin% s bir dizeyi değiştirir,% d bir veriyi değiştirir anlamına gelir, ancak bu durum hakkında hiçbir fikrim yok.


16
Bu iPython'dan sihirli bir komuttur. Bkz: ipython magics
MrAlexBailey

Yanıtlar:


91

%timeitbelirli bir kod parçasını zamanlamak için kullanılabilen bir ipython sihirli işlevidir (Tek bir yürütme ifadesi veya tek bir yöntem).

Dokümanlardan:

% timeit

Time execution of a Python statement or expression

Usage, in line mode:
    %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement

Kullanmak için, örneğin kullanmanın kullanmaktan xrangedaha hızlı olup olmadığını öğrenmek istiyorsak range, şunları yapabilirsiniz:

In [1]: %timeit for _ in range(1000): True
10000 loops, best of 3: 37.8 µs per loop

In [2]: %timeit for _ in xrange(1000): True
10000 loops, best of 3: 29.6 µs per loop

Ve onlar için zamanlamaları alacaksın.

En büyük avantajı %timeit:

  • Bunu yok ithalat zorunda timeit.timeit standart kitaplığından ve şekle kodu birden çok kez çalıştırmak hangi iyi yaklaşımdır.

  • % timeit, toplam 2 saniyelik yürütme penceresine dayalı olarak kodunuz için gereken çalıştırma sayısını otomatik olarak hesaplayacaktır.

  • Ayrıca timeit.timeittimeit'in çalıştığı başka bir ortamda oluşturulmuş değişkeni oluşturmak durumunda olduğu gibi, tüm kod parçacığını geçmeden de geçerli konsol değişkenlerini kullanabilirsiniz .


1
ipython kabuğundan bir makroyu veya bir dizi satırı zamanlamanın bir yolu var mı?
alpha_989

2
@ alpha_989 Evet, bu satır kümelerini bir işlev içinde kaydırabilir ve ardından işlevi şu şekilde zamanlayabilirsiniz:%timeit function()
mu 無

@mu 無: Lütfen açıklığa kavuşturun timer.timeit- bu gerçek bir modül adı mı?
Fountainhead


çıktı 10000 loops, best of 3: 29.6 µs per loopşu şekilde yorumlanabilir: (1.) ifade toplam süreyi elde etmek için 10000 defa çalıştırılır (2.) sonra toplam süre "döngü başına" süre elde etmek için 10000'e bölünür ve (3.) toplam süre hesaplaması yapılır Toplam 3 sürenin 3 katı ve son olarak (4.) minimum toplam süre (aka "3'ün en iyisi") çıktı olarak kullanılır. yorumum doğru mu, evet / hayır?
Trevor Boyd Smith

37

Bu, iPython'da bir çizgi büyüsü olarak bilinir . Argümanlarının yalnızca mevcut satırın sonuna kadar uzanması ve sihirlerin kendilerinin komut satırı geliştirme için gerçekten yapılandırılmış olmaları bakımından benzersizdirler. timeitkodun yürütülmesini zamanlamak için kullanılır.

Kullanabileceğin tüm sihirleri görmek istersen, basitçe yazabilirsin:

%lsmagic

hem çizgi büyüleri hem de hücre büyülerinin bir listesini almak için.

Belgelerinden bazıları başka sihirli bilgiler burada :

IPython, Python sözdizimine ortogonal olan ve kullanıcı tarafından yeni komutlarla genişletilebilen mini bir komut dilini etkili bir şekilde sağlayan sihir dediğimiz bir komut sistemine sahiptir . Sihirlerin etkileşimli olarak yazılması amaçlanmıştır, bu nedenle bağımsız değişkenleri ayırmak için beyaz boşluk, seçenekler için kısa çizgiler ve bir komut satırı ortamına özgü diğer kurallar gibi komut satırı kurallarını kullanırlar.

Satır modunda veya hücre modunda olmanıza bağlı olarak, kullanmanın iki farklı yolu vardır %timeit. Sorunuz birinci yolu gösteriyor:

In [1]: %timeit range(100)

vs.

In [1]: %%timeit 
      : x = range(100)
      :


2

Ben ila% sürümüyle gelen timeit kullanmanın başka bir faydalı avantajını eklemek gibi olur cevap tarafından mu無olun:

  • Sen de geçerli konsol değişkenlerin yararlanabilirler sürümüyle gelen timeit çalıştığını bir başka çevre içinde inşa edilmiştir inşa değişkene timeit.timeit olduğu gibi bütün kod parçacığını geçmeden.

Not: Bunun yukarıda cevaplanması gereken bir yorum olması gerektiğini biliyorum, ancak şu anda bunun için yeterli itibarım yok, umarım yazdıklarım birisine yardımcı olur ve bir dahaki sefere yorum yapmam için yeterli itibar kazanmama yardımcı olur.


1
İyileştirmek için başka birinin cevabını da düzenleyebilirsiniz. Bunun için zaten yeterince itibara sahip olmalısın
Tarick Welling

Teşekkürler bunu bilmiyordum. @TarickWelling
Ankit Agrawal

2

Sadece %% timeit hakkında çok ince bir nokta eklemek istedim . Hücrede "sihir" çalıştırdığı için , hata alırsınız ...

UsageError: Satır büyüsü işlevi %%timeitbulunamadı

... %% timeit üzerinde herhangi bir kod / yorum satırı varsa. Başka bir deyişle, hücrenizdeki ilk komutun %% timeit olduğundan emin olun.

Bunun tüm uzmanların duh diyeceği küçük bir nokta olduğunu biliyorum, ancak sihir numaralarıyla başlayan genç büyücüler için yarım sentimi eklemek istedim.


1
Bu, iPython kabuğunda geçerli değildir, yalnızca bir Jupyter not defterinde geçerlidir
snakecharmerb

0

Satır büyülerine % karakteri eklenir ve OS komut satırı çağrılarına çok benzer şekilde çalışırlar: satırın geri kalanını argüman olarak alırlar, burada argümanlar parantez veya tırnaklar olmadan iletilir. Hücre sihirlerinin önüne çift %% eklenir ve bunlar yalnızca satırın geri kalanını değil, aynı zamanda altındaki satırları da ayrı bir argümanda argüman olarak alan işlevlerdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.