SORU
18 Kasım 2013, PAZARTESİ


anlama - "set filtreleme listesi() tuzak"

Makul ortak bir operasyon bir list list başka bir süzmek. İnsanlar hızlı bir şekilde bulmak:

[x for x in list_1 if x in list_2]

büyük giriş için yavaş - Ey (*m n). İğrenç. Bu nasıl hızlandırabiliriz? Filtreleme aramaları yapmak için set O(1) kullanın:

s = set(list_2)
[x for x in list_1 if x in s]

Bu güzel genel olarak O(n) davranış verir. Ben ancak genellikle daha deneyimli kodlayıcılar düşmek bakınTuzak™:

[x for x in list_1 if x in set(list_2)]

Ack! Bu yine O (*m n) python beri oluşturur set(list_2)herzaman, sadece bir kez değil.


Bu kez hikayenin sonu - python uzak tek set inşa etmek için optimize edemez sanıyordum. Sadece hatadır farkında olun. Bununla yaşamak zorunda. Hmm.

#python 3.3.2 
list_2 = list(range(20)) #small for demonstration purposes
s = set(list_2)
list_1 = list(range(100000))
def f():
    return [x for x in list_1 if x in s]
def g():
    return [x for x in list_1 if x in set(list_2)]
def h():
    return [x for x in list_1 if x in {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}]

%timeit f()
100 loops, best of 3: 7.31 ms per loop

%timeit g()
10 loops, best of 3: 77.4 ms per loop

%timeit h()
100 loops, best of 3: 6.66 ms per loop

Ha, python (3.3)olabilirbir dizi edebi optimize uzakta. Muhtemelen LOAD_FAST LOAD_GLOBAL bir yerini alır, çünkü daha hızlı f() daha bu durumda.

#python 2.7.5 
%timeit h()
10 loops, best of 3: 72.5 ms per loop

Python 2 özellikle bu optimizasyon yapmaz. Daha ne olduğunu araştırmaya çalıştım ama ne yazık ki dis.dis olamaz anlama ifadeler bağırsaklar prob. Aslında her şey ilginç MAKE_FUNCTION dönüşür.

Şimdi merak ediyorum - neden 3 python.x kümesi sadece bir kez oluşturmak için hazır optimize uzakta, ama set(list_2) değil mi?

CEVAP
18 Kasım 2013, PAZARTESİ


set(list_2) optimize etmek amacıyla tercüman list_2 (ve organlarının tümü) yineleme arasında değişmez olduğunu kanıtlaması gerekiyor. Bu genel durum içinde zor bir sorundur ve eğer tercüman bile mücadele etmeyi denemek Eğer bana sürpriz olmaz.

Öte yandan set değişmez bir yineleme arasında değerini değiştirmek, optimizasyon güvenli olduğu bilinmektedir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kimberly p

    kimberly p

    23 Ocak 2010
  • mist64

    mist64

    30 Mayıs 2006
  • Techmoan

    Techmoan

    31 Mayıs 2009