Saya memiliki persyaratan unik yang dapat dijelaskan oleh kode ini. Ini adalah kode yang berfungsi tetapi tidak efisien memori.
data = [[
"A 5408599",
"B 8126880",
"A 2003529",
],
[
"C 9925336",
"C 3705674",
"A 823678571",
"C 3205170186",
],
[
"C 9772980",
"B 8960327",
"C 4185139021",
"D 1226285245",
"C 2523866271",
"D 2940954504",
"D 5083193",
]]
temp_dict = {
item: index for index, sublist in enumerate(data)
for item in sublist
}
print(data[temp_dict["A 2003529"]])
out: ['A 5408599', 'B 8126880', 'A 2003529']
Singkatnya, saya ingin setiap item dari sub-daftar dapat diindeks dan harus mengembalikan sublist.
Metode di atas berfungsi tetapi dibutuhkan banyak memori saat data berukuran besar. Apakah ada cara yang lebih baik, ramah memori dan CPU? Data disimpan sebagai file JSON.
Sunting Saya mencoba jawaban untuk skenario penggunaan terbesar (1000 sublist, 100 item di setiap sublist, 1 juta kueri) dan berikut ini hasilnya (rata-rata 10 run):
Method, Time (seconds), Extra Memory used
my, 0.637 40 Mb
deceze, 0.63 40 Mb
James, 0.78 200 kb
Pant, > 300 0 kb
mcsoini, forever 0 kb
{item: sublist for sublist in data for item in sublist}
mungkin sedikit lebih efisien dan langsung ... ?!Jawaban:
Anda benar-benar berada dalam ruang trade-off antara waktu / memori yang diperlukan untuk menghasilkan kamus versus waktu yang diperlukan untuk memindai seluruh data untuk metode on-the-fly.
Jika Anda menginginkan metode memori rendah, Anda dapat menggunakan fungsi yang mencari nilai masing-masing sublist. Menggunakan generator akan mendapatkan hasil awal lebih cepat bagi pengguna, tetapi untuk set data besar, ini akan lambat di antara pengembalian.
Seperti disebutkan dalam komentar, membangun tabel hash hanya berdasarkan huruf pertama atau 2 atau 3 karakter pertama mungkin merupakan tempat yang baik untuk memulai. Ini akan memungkinkan Anda untuk membuat daftar kandidat sublists, kemudian memindai mereka untuk melihat apakah nilainya ada dalam sublist.
Dalam kode ini
quick_hash
akan membutuhkan waktu untuk membangun, karena Anda memindai seluruh struktur data Anda. Namun, cetakan kaki memori akan jauh lebih kecil. Parameter utama Anda untuk kinerja tuning adalahsize
. Ukuran yang lebih kecil akan memiliki jejak memori yang lebih kecil, tetapi akan memakan waktu lebih lama ketika berjalanfind_list_by_hash
karena kumpulan calon Anda akan lebih besar. Anda dapat melakukan beberapa pengujian untuk melihat apa yangsize
seharusnya untuk data Anda. Ingatlah bahwa semua nilai Anda setidaknya selamasize
.sumber
Anda dapat mencoba sesuatu seperti ini:
Tidak perlu membuat struktur pemetaan.
sumber
coba ini, menggunakan panda
ini terlihat solusi sederhana, bahkan jika data Anda tumbuh besar, ini akan menangani itu secara efisien
sumber
df
: itu jauh lebih besar dari daftardata
(> x12) dan dicttemp_dict
(~ x2) untuk contoh data yang diberikan - tidak persis hemat memori saya akan mengatakanpandas
menangani masalah ini lebih efisien daripada fungsi python bawaan.pandas
jika itu bisa dilakukan menggunakanstdlib
. Hanya karena terlihat mewah?Saya tidak sepenuhnya yakin bagaimana ini akan berperilaku untuk data jumlah yang lebih besar, tetapi Anda dapat mencoba sesuatu di sepanjang baris:
Sunting: Tampaknya tidak menguntungkan dalam hal waktu, berdasarkan tes cepat dengan beberapa data skala besar palsu.
sumber