2016-01-10 7 views
9

Anladığım kadarıyla, tupl ve dizgiler değişmeyecek olan bellekleri yeniden kullanmak gibi optimizasyonlara izin vermek için değişmezdir. Bununla birlikte, belli bir optimizasyon, tuple dilimlerinin orijinal tuple aynı belleğe başvurmasını sağlar, python'a dahil değildir.Tuplelar değişmez olduğundan, onları dilimlemek niçin bir görünüm yerine bir kopyasını oluşturuyor?

Ben bu optimizasyon dahil değildir çünkü biliyorum zaman aşağıdaki fonksiyonu, zaman alınan O gibi gittiğinde (n^2) yerine O (n), yani tam kopyalama gerçekleşiyor:

def test(n): 
    tup = tuple(range(n)) 
    for i in xrange(n): 
     tup[0:i] 

Bu optimizasyon uygulandığında bazı python davranışları değişecek mi? Orijinalin değişmez olduğu durumlarda bile kopyalama için bazı performans avantajları var mı?

+8

Bazen cevap “çünkü hiç kimse onu tam olarak uygulamak için zaman ayırmadı”. –

+1

Bir çekme isteği gönderin :) –

+0

Kopyalama miktarını azalttığınız ve işaretlediğiniz sayının azaltılmasıyla, daha önce toplanan çöpün sayılması için, orijinal tuple sayısı azaltılabilir. – cr3

cevap

1

view, numpy'un yaptıklarına denk bir şey mi düşünüyorsunuz? Ben numpy bunu neden ve nasıl yaptığını biliyorum.

numpyarray şekil ve dtype bilgilerinin yanı sıra bir veri arabelleğe sahip bir nesnedir. Bu bilgileri __array_interface__ özelliğinde görebilirsiniz. Bir view, kendi şekil niteliğine sahip, ancak kaynak arabelleğinde bir yere işaret eden yeni bir veri arabelleği işaretçisi olan yeni bir numpy nesnesidir. Ayrıca "arabam yok" yazan bir bayrak var. numpy ayrıca kendi referans sayısını da korur, böylece orijinal (sahip) dizisi silinirse (ve toplanan çöp) veri arabelleği yok olmaz.

Bu görünüm kullanımı, özellikle çok büyük dizilerle (örneğin, bellek hatalarıyla ilgili sorular SO'da yaygındır) büyük zaman tasarrufu sağlayabilir. Görünümler ayrıca farklı dtype izin verir, böylece bir veri arabelleği 4 bayt tamsayı veya 1 bayt karakter, vb. Görüntülenebilir.

Bu nasıl tuples için geçerlidir? Tahminimce fazladan bir bagaj gerektirmesi. Bir tuple, sabit bir nesne işaretçisi setinden oluşur - muhtemelen bir C dizisi. Bir görünüm aynı diziyi kullanır, ancak kendi başlangıç ​​ve bitiş işaretçileriyle (işaretçiler ve/veya uzunluklar). Bayrakları paylaşmaya ne dersin? Çöp toplama?

Ve tipik boyut ve tupllerin kullanımı nedir? Tuple'ların ortak kullanımı argümanları bir işleve iletmektir. Tahminimce tipik bir Python çalışmasında tuplelerin çoğunluğu küçük - 0, 1 veya 2 elementtir. Dilimlere izin verilir, ancak çok yaygın mı? Küçük tuples veya çok büyük olanlar?

Tuple dilimleri görünümleri yapmak (istenmeyen bir şekilde) için istenmeyen sonuçlar doğurur mu? Görünümler ve kopyalar arasındaki ayrım, numpy kullanıcılarının kavraması daha zor şeylerden biridir. Bir tuple immutable olması gerekiyordu - bu tuple içindeki işaretçiler değiştirilemez - uygulamaların uygulanmasının kullanıcılar için görünmez olması mümkündür. Ama yine de merak ediyorum.

PyPy sürümünün bir dalı üzerinde bu fikri denemek mantıklı gelebilir - Cpython koduna girmeyi gerçekten istemediğiniz sürece. Veya Cython ile özel bir sınıf olarak.

İlgili konular