2014-03-27 3 views
1

Я ищу самый быстрый способ сравнения строкового элемента в python.Самый быстрый способ сравнения строковых элементов в Python

import os, glob, numpy as np 

with open ('fname.txt','r') as fi: ##This infile contains 9 thousands of string elements 
    all_list = fi.read().splitlines() 

existing_list = glob.glob('*jpg') ##This contains 5 thousands elements 
existing_list = [os.path.basename(f) for f in existing_list] 

remaining_list = [f for f in all_list if f not in existing_list] 
for i in remaining list: 
    print i 

Как это сделать в Numpy?

all_list = np.array(all_list) 
existing_list = np.array(existing_list) 
remaining_list = ??? 
+0

просто создайте 'existing_list'' 'set, и вам не нужно использовать numpy. – roippi

+0

Нижняя половина вашего вопроса не соответствует вашему названию или остальной части –

ответ

1

Вы можете оптимизировать этот без Numpy, если вы будете использовать набор:

existing_set = {os.path.basename(f) for f in existing_list} # set comprehension, python2.7+ 
# alternatively: set(os.path.basename(f) for f in existing_list) 

remaining_list = [f for f in all_list if f not in existing_set] 

я сомневаюсь, что вы получите много производительности здесь с помощью NumPy, даже если вы выяснили, способ сделать это ...

+0

спасибо, ваш код ускорит мою работу. btw я не мог понять, что эта функция набора сделала для меня, чтобы ускорить вычисление. –

+1

'in' для' list' фактически просматривает каждый элемент в списке и сравнивает его один за другим, что делает его операцией O (n). 'in' для' set' полагается на хеширование. По сути, вам просто нужно хэш-строку, и вы можете выяснить, находится ли она в наборе в O (1) раз. Конечно, это не бесплатно. Вы теряете возможность заказывать данные в наборе, а элементы, которые вы вставляете, должны быть хешифицированы. В вашем случае заказ не имеет значения, и строки всегда будут хешифицированы, поэтому вы все настроены (каламбур). – mgilson

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