2016-03-09 4 views
0

Я разделяю csv на два csvs, основываясь на значении в столбце исходного CSV. Этот код работает, но занимает около часа для запуска csv с около 10000 записей. Я попытался перечислить список, но я не думаю, что это был правильный подход к ускорению этого.медленный скрипт python при переходе по списку

Я очень медленно и очень новичок в этом программировании, и был бы признателен, если бы кто-нибудь смог объяснить, где сосредоточиться на моих следующих усилиях, чтобы сделать это быстрее. Я знаю, что наименьшее количество строк лучше, но я не понимаю, как делать циклы при создании двух отдельных csvs. Является ли цикл даже проблемой здесь?

myList = ['2','12','20','33'...] 
with open(originalCSV, 'rb') as f: 
    reader = csv.DictReader(f) 
    rows = [row for row in reader if row['Column 10'] in myList] 
for row in rows: 
    with open(inmylistCSV, 'wb') as w: 
     fieldnames = ['Column 1', 'Column 2', 'Column 5', 'Column 10'] 
     csvwriter = csv.DictWriter(w, fieldnames=fieldnames) 
     csvwriter.writeheader() 
     csvwriter.writerows(rows) 

with open(originalCSV, 'rb') as f: 
    reader = csv.DictReader(f) 
    rows = [row for row in reader if row['Column 10'] not in myList] 
for row in rows: 
    with open(notinmylistCSV, 'wb') as w: 
     fieldnames = ['Column 1', 'Column 2', 'Column 5', 'Column 10'] 
     csvwriter = csv.DictWriter(w, fieldnames=fieldnames) 
     csvwriter.writeheader() 
     csvwriter.writerows(rows) 

ответ

2

Основная проблема заключается в том, что ваш цикл через 10 000 записей 2x. Таким образом, по существу, делают ваши 20000 записей работы (необходимые DOUBLE)

# This is what your doing 

for x in range(10000): 
    if is_odd(x): 
     print('I am odd') 

for x in range(10000): 
    if is_even(x): 
     print('I am even') 

Простое исправление будет просто совместить логику в виде

# This is what you should be doing 

for x in range(10000): 
    if is_odd(x): 
     print('I am odd') 
    else: 
     print('I am even') 

Итак, в заключение, у вас есть 2 вещи, которые вы должны сделать прямо сейчас

1) сочетают в себе следующие строки логически

rows = [row for row in reader if row['Column 10'] in myList] 
rows = [row for row in reader if row['Column 10'] not in myList] 

2) оптимизировать написание участок

with open(notinmylistCSV | inmylistCSV, 'wb') as w: 
    fieldnames = ['Column 1', 'Column 2', 'Column 5', 'Column 10'] 
    csvwriter = csv.DictWriter(w, fieldnames=fieldnames) 
    csvwriter.writeheader() 
    csvwriter.writerows(rows) 

к сведению, что это псевдокод

+0

Благодарим за объяснение, это решило мою проблему! – JS24

0

почему не только прочитать оригинальный CSV и распространять строки с другими томами CSV?

myList = ['2','12','20','33'...] 

fieldnames = ['Column 1', 'Column 2', 'Column 5', 'Column 10'] 

in_list = open(inmylistCSV, 'wb') 
in_list_csvwriter = csv.DictWriter(in_list, fieldnames=fieldnames) 
in_list_csvwriter.writeheader() 

not_in_list = with open(notinmylistCSV, 'wb') 
not_in_list_csvwriter = csv.DictWriter(not_in_list, fieldnames=fieldnames) 
not_in_list_csvwriter.writeheader() 

with open(originalCSV, 'rb') as f: 
    reader = csv.DictReader(f) 
    for row in reader: 
     if row['Column 10'] in myList: 
      in_list_csvwriter.writerow(row) 
     else: 
      not_in_list_csvwriter.writerow(row) 
+0

Спасибо, я тоже устал, и он отлично работал. Очень признателен – JS24

Смежные вопросы