Форум сайта python.su
0
Всем привет! Суть проблемы в следующем: есть выгрузка данных из ИС в формате csv, необходимо из этой выгрузки оставить только те строки, в которых значение поля dst_ip есть в списке ip определённого домена. Набросал вот такой код на коленке, но он работает очень долго из-за тупого перебора двух массивов. Есть ли возможность оптимизировать скорость работы?
На вход поступает 2 csv файла, первый - выгрузка, второй - список ip, которые должны быть в первом.
# Compare 2 arrays of ip import csv import sys res_csv_file = open('result.csv', 'wb') fieldnames = [ 'start', 'end', 'time', 'IMSI', 'int_ip', 'int_port', 'trans_ip', 'trans_port', 'dst_ip', 'dst_port', 'traffic'] reswriter = csv.DictWriter(res_csv_file, delimiter=';', fieldnames=fieldnames) reswriter.writerow(dict((fn, fn) for fn in fieldnames)) src_csv_file = open(sys.argv[1], 'rb') ip_csv_file = open(sys.argv[2], 'rb') src_csv_dict = csv.DictReader(src_csv_file, delimiter=';', quotechar='"') ip_csv_dict = csv.DictReader(ip_csv_file, delimiter=';', quotechar='"') rows = list(src_csv_dict) totalrows = len(rows) print "Total values to check: %s " % (totalrows) i = 0 src_csv_file.seek(0) for req_ip in src_csv_dict: i += 1 sys.stdout.write("Progress %s%%\r" % ((i * 100) / totalrows)) sys.stdout.flush() ip_csv_file.seek(0) for host_ip in ip_csv_dict: if req_ip['dst_ip'] in host_ip.values(): reswriter.writerow(req_ip) print "Job completed"
Офлайн
47
из второго файла сделай set, потом итерируйся по первому как сейчас и проверяй вхождение
Офлайн
857
Volandв чём смысл этой строки ?src_csv_file.seek(0)
Volandприведи пример исходных данных (файл с данными, список исключений)
Суть проблемы в следующем: есть выгрузка данных из ИС в формате csv, необходимо из этой выгрузки оставить только те строки, в которых значение поля dst_ip есть в списке ip определённого домена.
Volandвсе сейчас будут догадываться, какие массивы ты имеешь в виду, читая этот код полчаса
Набросал вот такой код на коленке, но он работает очень долго из-за тупого перебора двух массивов.
Volandво-во, все должны телепатически догадаться, какие там структуры данныхif req_ip['dst_ip'] in host_ip.values():
Отредактировано py.user.next (Окт. 17, 2013 19:32:02)
Офлайн
0
py.user.nextЭта строка нужна для работы цикла for req_ip in src_csv_dict:
src_csv_file.seek(0)
bismigalisСпасибо, действительно, работает на порядок быстрее
из второго файла сделай set, потом итерируйся по первому как сейчас и проверяй вхождение
Отредактировано Voland (Окт. 18, 2013 08:51:27)
Офлайн