Тест if strand1 == '-'
не зависит от содержимого f2 . Следовательно, вы можете поместить его перед циклом в f2 и запустить проверку всего содержимого f2 , только если текущая строка f1 содержит Strand1 со значением '-'
Учитывая также тот факт, что сначала существует if strand1 == '-'
, а затем if strand1 == strand
, это означает, что вас также интересуют только строки в f2 , в которых прядь имеет значение '-'.
Более того, я воспользовался идеей Дж. Ф. Себастьяна для проверки пересечения двух диапазонов без помощи множеств, а только для проверки границ диапазонов. Однако нет необходимости использовать диапазон или xrange , проверки границ достаточно.
Итак, я предлагаю следующий код в качестве простого улучшения вашего алгоритма:
for line in f1:
(chrR,chrStart,chrEnd,name,score,strand1,codingStart,codingEnd,
itemRbg,blockCount,blockSize,BlockStart) = line.strip().split()
if strand1 == '-':
s,e = int(chrStart), int(chrEnd)
for line in f2:
chrC,clustStart,clustEnd,annote,score,strand = line.strip().split()
if strand=='-' and chrR == chrC \
and int(clustStart)<e and s<int(clustEnd):
print name,annote,'transcript'
f2.seek(0,0)
.
Однако этот алгоритм (ваш, исправленный) плох: есть полное чтение содержания f2 для каждой строки f1 , содержащей strand1 со значением '-'.
Алгоритм Дж. Ф. Себастьяна намного лучше.
Я немного улучшил его, с идеями, изложенными выше.
with open(sys.argv[2]) as f2:
clusters = []
for i, line in enumerate(f2):
parts = line.split()
if len(parts) != 6:
print >>sys.stderr, "%d line has %d parts: %s" % (i,len(parts),line),
continue
chrC, clustStart, clustEnd, annote, _, strand = parts
if strand=='-':
clusters.append((chrC, int(clustStart), int(clustEnd), annote))
with open(sys.argv[1]) as f1:
for i, line in enumerate(f1):
parts = line.split()
if len(parts) < 6:
print >>sys.stderr, "%d line has %d parts: %s" % (i,len(parts),line),
continue
chrR, chrStart, chrEnd, name, _, strand1 = parts[:6]
if strand1 == '-':
for chrC,iclustStart,iclustEnd,annote in clusters:
if chrR == chrC \
and iclustStart<int(chrEnd) and int(chrStart)<iclustEnd:
print name, annote, 'transcript'