Марк Рушаков, похоже, решил вашу непосредственную проблему, но есть некоторые другие улучшения, которые могут быть внесены в ваш код.
- Всегда используйте контекстные менеджеры (
with open(filename, mode) as f:
) для открытия файлов, а неполагаясь на close
, вызываемую вручную. Не беспокойтесь о том, чтобы читать весь файл в память очень часто.Цикл по some_file.readilines()
может быть заменен на цикл по some_file
напрямую.
- Например, вы могли бы использовать
map(string.strip, ligland_file)
или еще лучше [line.strip() for line in ligland_file]
Не выбирайте имена, чтобы включить тип объекта, на который они ссылаются.Эту информацию можно найти другими способами.
Например, размещенный вами код можно упростить до чего-то вроде
import sys
from contextlib import nested
some_real_name = sys.argv[1]
other_file = "unique_count_c_from_ac.txt"
with nested(open(some_real_name, "r"), open(other_file, "r")) as ligand_1, ligand_2:
for line_1 in ligand_1:
# Take care of the trailing newline
line_1 = line_1.strip()
for line_2 in ligand_2:
line_2 = line2.strip()
numbers = line2.split()
if line_1 == numbers[1]:
# If the second number from this line matches the number that is
# in the user's file, print all the numbers from this line
print ' '.join(numbers)
, что является более надежным иЯ считаю, что легче читать.
Обратите внимание, что алгоритмическая производительность этого далеко от идеала из-за этих вложенных циклов.В зависимости от ваших потребностей, это может быть потенциально улучшено, но, поскольку я не знаю точно, какие данные вам нужно извлечь, чтобы сказать вам, можете ли вы.
Время, которое в настоящее время занимает мой код, а ваш - O(n m q), где n - количество строк в одном файле, m - количество строк в другом, а q - длина строк в unique_count_c_from_ac.txt.Если два из них являются фиксированными / малыми, то у вас линейная производительность.Если два могут расти произвольно (я представляю, что n и m могут?), То вы можете изучить улучшение своего алгоритма, возможно, с помощью наборов или диктов.