SORU
12 ŞUBAT 2014, ÇARŞAMBA


Hızlı bir şekilde ve bir iterable sayısı toplamı tek geçişte gerek

Herhangi biri bana yardımcı olabilir mi? Hesaplamak için bir yol bulmaya çalışıyorum

>>> sum_widths = sum(col.width for col in cols if not col.hide)

ve aynı zamanda cols üzerinde iki geçiş yapmak zorunda kalmadan bu toplam öğe sayısını saymak.

Görünüyor inanılmaz ama sonra tarama std-lib (dahili fonksiyonları, itertools, functools, vb), ben yapamasam da bul bir işlevi olan sayısı üye sayısı bir iterable. İşlevi istiyorum ne gibi sesler itertools.count,, buldum ama gerçekten sadece bir aldatıcı 8 ** fonksiyon adı verilmiştir.

Biraz düşündükten sonra aşağıdaki bir kütüphane işlevi olmaması mazur görülebilir, onun obtuseness hariç olabilir o kadar basit olan) ile geldi:

>>> visable_col_count = sum(col is col for col in cols if not col.hide)

Ancak, bu iki fonksiyonu kullanarak sadece bir türlü ısınamadım olan iterable, iki geçiş yapılmasını gerektirir.

Alternatif olarak, aşağıdaki fonksiyonu ben ne istiyor:

>>> def count_and_sum(iter):
>>>     count = sum = 0
>>>     for item in iter:
>>>         count  = 1
>>>         sum  = item
>>>     return count, sum

Bu sorun 100 kat daha uzun (timeit göre) üreteç ifadesi bir form toplamı olarak alır.

Eğer kimse istediğimi yapar basit bir-liner ile gelip eğer, lütfen bana bildirin (Python 3.3 kullanarak).

1 düzenleyin

Büyük fikirler bir sürü burada, çocuklar. Cevap yazan herkese teşekkürler. Beni bir süre bu cevapları sindirimi alacak, ama olacak ve kontrol etmek için bir seçim için çalışacağız.

2 düzenleyin

Tekrar ettim zamanlamaları benim iki naçizane öneri (count_and_sum fonksiyon ve 2 ayrı sum fonksiyonlar) ve keşfedilen bu benim özgün bir zamanlama oldu uzakta, muhtemelen nedeniyle otomatik zamanlanmış yedekleme işlemi arka planda.

Ben de mükemmel öneriler cevapları burada verilen çoğu, hepsi aynı model ile zamanlanmış. Bu cevaplar benim için oldukça iyi bir eğitim almıştır analiz: deque, enumerate count accumulate ** 16 yaşında ve ilk kez yeni kullanır. Herkese teşekkürler!

Burada sonuçları (yavaş benim netbook) ekran için yazılım geliştiriyorum kullanarak:

┌───────────────────────────────────────────────────────┐
│                 Count and Sum Timing                  │
├──────────────────────────┬───────────┬────────────────┤
│          Method          │Time (usec)│Time (% of base)│
├──────────────────────────┼───────────┼────────────────┤
│count_and_sum (base)      │        7.2│            100%│
│Two sums                  │        7.5│            104%│
│deque enumerate accumulate│        7.3│            101%│
│max enumerate accumulate  │        7.3│            101%│
│reduce                    │        7.4│            103%│
│count sum                 │        7.3│            101%│
└──────────────────────────┴───────────┴────────────────┘

(Zaman karmaşık ve çok belirsiz olarak yöntem, ama yine de teşekkürler kat edemedim.)

Beri orada çok az fark zamanlama arasında tüm bu yöntemler karar verdim kullanmak için count_and_sum fonksiyon (açık for döngü) olarak en okunaklı, açık ve basit bir Python Zen) ve aynı zamanda en hızlı!

Keşke kabul bu şaşırtıcı cevaplar doğru ama hepsi eşit derecede iyi olsa daha fazla veya daha az belirsiz, bu yüzden ben sadece oy veren herkes ve kabul benim kendi cevap doğru (count_and_sum fonksiyon) beri ben kullanıyorum.

O neydi öyle "birinci ve tercihen sadece bunu yapmak için bir ... belirgin bir yolu olmalı".

CEVAP
12 ŞUBAT 2014, ÇARŞAMBA


Hızı bilmem ama bu çok hoş

>>> from itertools import accumulate
>>> it = range(10)
>>> max(enumerate(accumulate(it), 1))
(10, 45)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GUN-TIME with Brandon

    GUN-TIME wit

    3 ŞUBAT 2009
  • tsweeney79

    tsweeney79

    21 Ocak 2008
  • Vagrant Records

    Vagrant Reco

    8 Mayıs 2006