Jadi saya bertanya-tanya bagaimana cara terbaik membuat daftar daftar kosong:
[[],[],[]...]
Karena cara Python bekerja dengan daftar di memori, ini tidak berfungsi:
[[]]*n
Ini memang membuat [[],[],...]
tetapi setiap elemen adalah daftar yang sama:
d = [[]]*n
d[0].append(1)
#[[1],[1],...]
Sesuatu seperti pemahaman daftar berfungsi:
d = [[] for x in xrange(0,n)]
Tapi ini menggunakan VM Python untuk perulangan. Apakah ada cara untuk menggunakan loop tersirat (memanfaatkannya karena ditulis dalam C)?
d = []
map(lambda n: d.append([]),xrange(0,10))
Ini sebenarnya lebih lambat. :(
d = [[] for x in xrange(0,n)]
. Anda harus melakukan loop secara eksplisit dengan Python atau memanggil fungsi Python / lambda berulang kali (yang seharusnya lebih lambat). Tapi tetap berharap seseorang akan memposting sesuatu yang menunjukkan bahwa saya salah :).timeit
, apa yang Anda pelajari?map(lambda x: [], xrange(n))
itu lebih lambat dari pemahaman daftar.Jawaban:
Mungkin satu-satunya cara yang sedikit lebih cepat dari
adalah
Itu tidak harus membuat
int
objek baru di setiap iterasi dan sekitar 15% lebih cepat di mesin saya.Edit : Dengan NumPy, Anda dapat menghindari loop Python menggunakan
tetapi ini sebenarnya 2,5 kali lebih lambat daripada pemahaman daftar.
sumber
map(lambda x:[], repeat(None,n))
?Daftar comprehensions sebenarnya dilaksanakan lebih efisien daripada looping eksplisit (lihat yang
dis
keluaran misalnya fungsi ) danmap
cara memiliki untuk memohon sebuah objek callable ophaque pada setiap iterasi, yang menimbulkan biaya overhead overhead yang cukup.Apapun,
[[] for _dummy in xrange(n)]
adalah cara yang tepat untuk melakukannya dan tidak ada yang kecil (jika ada sama sekali) perbedaan kecepatan antara berbagai cara lainnya harus peduli. Kecuali tentu saja Anda menghabiskan sebagian besar waktu Anda melakukan ini - tetapi dalam kasus itu, Anda harus mengerjakan algoritme Anda sebagai gantinya. Seberapa sering Anda membuat daftar ini?sumber
_
sebagai nama variabel! Jika tidak, jawaban yang bagus :)i
, saya akan mencari di mana itu digunakan). Satu-satunya kesalahan adalah bahwa hal itu membayangi_
hasil terakhir di REPL ... dan itu hanya kasus di 2.x di mana pemahaman daftar bocor._
interpreter interaktif, itu juga bertentangan dengan alias gettext umum. Jika Anda ingin menjelaskan bahwa variabel tersebut adalah variabel dummy, sebut sajadummy
, bukan_
.Berikut dua metode, yang satu manis dan sederhana (dan konseptual), yang lain lebih formal dan dapat diperluas dalam berbagai situasi, setelah membaca kumpulan data.
Metode 1: Konseptual
Metode 2: Formal dan dapat diperluas
Cara elegan lain untuk menyimpan daftar sebagai daftar daftar nomor yang berbeda - yang dibaca dari sebuah file. (File di sini memiliki rangkaian dataset) Train adalah kumpulan data dengan katakanlah 50 baris dan 20 kolom. yaitu. Train [0] memberi saya baris pertama dari file csv, train [1] memberi saya baris ke-2 dan seterusnya. Saya tertarik untuk memisahkan dataset dengan 50 baris sebagai satu daftar, kecuali kolom 0, yang merupakan variabel yang saya jelaskan di sini, jadi harus dihapus dari dataset orignal train, dan kemudian menskalakan daftar demi daftar- yaitu daftar daftar . Inilah kode yang melakukan itu.
Perhatikan bahwa saya membaca dari "1" di loop dalam karena saya hanya tertarik pada variabel penjelas. Dan saya menginisialisasi ulang X1 = [] di loop lain, jika tidak, X2.append ([0: (len (train [0]) - 1)]) akan menulis ulang X1 berulang kali - selain itu lebih hemat memori.
sumber
Untuk membuat daftar dan daftar gunakan sintaks di bawah ini
ini akan membuat daftar 1-d dan untuk memulainya masukkan nomor [[nomor] dan set panjang daftar masukkan panjang dalam kisaran (panjang)
ini akan menginisialisasi daftar daftar dengan 10 * 3 dimensi dan dengan nilai 0
sumber
Jadi saya melakukan beberapa perbandingan kecepatan untuk mendapatkan cara tercepat. Pemahaman daftar memang sangat cepat. Satu-satunya cara untuk mendekat adalah dengan menghindari bytecode keluar selama pembuatan daftar. Upaya pertama saya adalah metode berikut, yang pada prinsipnya tampak lebih cepat:
(menghasilkan daftar dengan panjang 2 ** n, tentu saja) Konstruksi ini dua kali lebih lambat dari pemahaman daftar, menurut timeit, untuk daftar pendek dan panjang (satu juta).
Upaya kedua saya adalah menggunakan starmap untuk memanggil konstruktor daftar untuk saya, Ada satu konstruksi, yang tampaknya menjalankan konstruktor daftar dengan kecepatan tinggi, tetapi masih lebih lambat, tetapi hanya dalam jumlah kecil:
Cukup menarik waktu eksekusi menunjukkan bahwa itu adalah panggilan daftar terakhir yang membuat solusi starmap lambat, karena waktu eksekusinya hampir persis sama dengan kecepatan:
Upaya ketiga saya datang ketika saya menyadari bahwa list (()) juga menghasilkan daftar, jadi saya mencoba yang benar-benar sederhana:
tapi ini lebih lambat dari panggilan starmap.
Kesimpulan: untuk maniak kecepatan: Gunakan pemahaman daftar. Hanya panggil fungsi, jika perlu. Gunakan bawaan.
sumber