Как я сказал в комментарии, для меня не похоже, что размер "bigfile" должен замедлять скорость, с которой увеличивается счетчик. Когда вы перебираете такой файл, Python просто читает по одной строке за раз по порядку.
Оптимизация, которую вы можете выполнить в этот момент, зависит от того, насколько велики строки matchedLines, и как соотносятся строки matchedLines с текстом, который вы просматриваете.
Если matchedLines велико, вы можете сэкономить время, выполнив «поиск» только один раз:
for line in completedataset:
text = line[:line.find(',')]
for t in matchedLines:
if t in text:
line = line.strip().split(',')
smallerdataset.write(','.join(line[:3]) + '\n')
break
В моих тестах поиск находился примерно в 300 наносекунд, поэтому, если длина строки matchedLines составляет несколько миллионов единиц, у вас есть лишняя секунда.
Если вы ищете точные совпадения, а не совпадения подстрок, вы можете ускорить процесс, используя набор:
matchedLines = set(matchedLines)
for line in completedataset:
target = line[:line.find(',')]
## One lookup and you're done!
if target in matchedLines:
line = line.strip().split(',')
smallerdataset.write(','.join(line[:3]) + '\n')
Если целевые тексты, которые не соответствуют друг другу, имеют тенденцию выглядеть совершенно иначе, чем те, которые делают (например, большинство целей являются случайными строками, а matchedLines представляет собой набор имен), а все matchedLines имеют длину выше определенной , вы можете попытаться стать действительно умным, проверив подстроки. Предположим, что все строки соответствий имеют длину не менее 5 символов ...
def subkeys(s):
## e.g. if len(s) is 7, return s[0:5], s[1:6], s[2:7].
return [s[i:i+5] for i in range(len(s) + 1 - 5)]
existing_subkeys = set()
for line in matchedLines:
existing_subkeys.update(subkeys(line))
for line in completedataset:
target = line[:line.find(',')]
might_match = False
for subkey in subkeys(target):
if subkey in existing_subkeys:
might_match = True
break
if might_match:
# Then we have to do the old slow way.
for matchedLine in matchedLines:
if matchedLine in target:
# Do the split and write and so on.
Но действительно легко перехитрить себя, пытаясь делать подобные вещи, и это зависит от того, как выглядят ваши данные.