У меня есть это уникальное требование, которое можно объяснить этим кодом. Это рабочий код, но не эффективный для памяти.
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']
Короче говоря, я хочу, чтобы каждый элемент подсписка был индексируемым и должен возвращать подсписок.
Вышеуказанный метод работает, но он занимает много памяти, когда данные большие. Есть ли лучший способ памяти и процессора? Данные хранятся в виде файла JSON.
Редактировать Я попробовал ответы для максимально возможного сценария использования (1000 подсписков, 100 элементов в каждом подсписке, 1 миллион запросов), и вот результаты (среднее из 10 прогонов):
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}
может быть немного более эффективным и прямым ... ?!Ответы:
Вы действительно находитесь в компромиссе между временем и памятью, которые требуются для создания словаря, и временем, которое требуется для сканирования всех данных для оперативного метода.
Если вам нужен метод с нехваткой памяти, вы можете использовать функцию, которая ищет значение в каждом подсписке. Использование генератора быстрее даст начальные результаты пользователю, но для больших наборов данных это будет медленно между возвратами.
Как уже упоминалось в комментариях, хорошим началом может стать построение хеш-таблицы, основанной только на первой букве или первых 2 или 3 символах. Это позволит вам составить список кандидатов из подсписков, а затем отсканировать их, чтобы увидеть, есть ли значение в подсписке.
Создание этого кода
quick_hash
займет некоторое время, поскольку вы сканируете всю структуру данных. Однако отпечаток памяти будет намного меньше. Вы основным параметром для настройки производительности являетсяsize
. Меньший размер будет занимать меньше места в памяти, но займет больше времени при запуске,find_list_by_hash
потому что ваш пул кандидатов будет больше. Вы можете провести некоторое тестирование, чтобы увидеть, какое правоsize
должно быть на ваши данные. Просто помните, что все ваши ценности по крайней мере так же долго, как иsize
.источник
Вы можете попробовать что-то вроде этого:
Не нужно составлять картографическую структуру.
источник
попробуйте это, используя панд
это выглядит простым решением, даже если ваши данные растут большими, это будет эффективно обрабатывать
источник
df
: он значительно больше, чем списокdata
(> x12) и dicttemp_dict
(~ x2) для данных данного примера - не совсем эффективно с памятью, я бы сказалpandas
обрабатывает эту проблему, чем встроенные функции Python.pandas
если это можно сделать с помощьюstdlib
. Просто потому что это выглядит модно?Я не совсем уверен, как это будет вести себя для больших объемов данных, но вы можете попробовать что-то вроде:
Изменить: не кажется полезным с точки зрения времени, на основе быстрого теста с некоторыми поддельными данными большего масштаба.
источник