SORU
10 HAZİRAN 2010, PERŞEMBE


Liste filtreleme: vs lambda filtre anlama liste

Bir listem var ve bu öğeleri bir öznitelik tarafından filtre var. temel filtreleme ihtiyacı olan kendimi bulmam oldu:

Benim kod bu gibi görünüyor.

my_list = [i for i in my_list if i.attribute == value]

Ama sonra düşündüm, daha iyi olmaz mıydı böyle yazmak için?

filter(lambda x: x.attribute == value, my_list)

Daha okunaklı ve performans için gerekirse lambda kazanmak için bir şey almış olabilir.

Soru: ikinci yolu kullanarak herhangi bir uyarı var mı? Herhangi bir performans farkı? Eksik Pythonic Yol tamamen™ ve başka bir şekilde (lambda yerine itemgetter gibi) yapmalı mıyım?

CEVAP
10 HAZİRAN 2010, PERŞEMBE


Kişiden kişiye değişir ne kadar garip. Bu liste üreteci çirkin filtre lambda den çok daha net buluyorum, ama daha kolay bulmak hangisi kullanın. Ancak, değişken isimleri zaten sadece çirkin ve tartışmaya açık bir konu değil bu yerleşiklere için kullanılan vermeyi bırak.

Filtre kullanımını yavaşlatabilir iki şey vardır.

Python fonksiyon (def olup olmadığını ya da lambda tarafından oluşturulan) olarak filtre listesi kavrama daha yavaş olması olasıdır olmaz. ilk işlev çağrısı yükü: Neredeyse kesinlikle bu konuda yeterli değildir, ve kod zaman aşımına ve bir tıkanıklık olduğu kadar fazla performans düşünmemelisin, ama fark orada olacak.

Geçerli olabilecek diğer havai lambda kapsamlı bir değişken (value) erişmek zorunda ediliyor. Bu yerel bir değişken erişim daha yavaş ve Python 2.x liste anlama sadece yerel değişkenleri erişir. Python 3 kullanıyorsanız.x liste anlama da bir kapatma ile value erişim olacak şekilde ayrı bir işlevi çalıştırır ve bu fark geçerli değildir.

Göz önünde başka seçenek listesi kavrama yerine bir jeneratör kullanmaktır

def filterbyvalue(seq, value):
   for el in seq:
       if el.attribute==value: yield el

Ana kod okunabilirliği çok önemli yeri olan) liste üreteci ve umarım anlamlı bir işlev adı ile filtre yerine geldin o zaman.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • OVERWERK

    OVERWERK

    6 Temmuz 2010
  • technodromeband's channel

    technodromeb

    28 NİSAN 2011
  • Subscribe!!

    Subscribe!!

    3 EKİM 2009