2017-03-16 9 views
0

私は2つの大きなファイルのデータ・セットを持っている:2つのリストと範囲の間の値を比較するPythonスクリプトの速度を向上させるにはどうすればよいですか?

File1: 
Gen1 1 1 10 
Gen2 1 2 20 
Gen3 2 30 40 

File2: 
A 1 4 
B 1 15 
C 2 2 

予想される出力:

Out: 
Gen1 1 1 10 A 1 4 
Gen2 1 2 20 B 1 15 

今、私は基本的にはちょうど[FILE2場合、ファイル2がファイル1である場合のインスタンスを検索しようとしているコードを持っています1] FILE1 [1]と一致し、これを実行する私のコードは、以下であるファイル1

範囲の間に入る:

for i in file1: 

    temp = i.split() 

    for a in file2: 

     temp2 = a.split() 

     if temp[1] == temp2[1] and temp2[2] >= temp[2] and temp2[2] <= temp[3] 

      print(i + " " + a + "\n") 

     else: 

      continue 

コードは機能しますが、それよりもはるかに長い時間がかかります。これを行う簡単な方法や方法はありますか?私は、地図やハッシュを巧みに使いこなしていると感じています。

ありがとうございました!

+0

40 30は、有効範囲のように見えるしていませんか? –

+0

正しい私はそれを修正する必要があります! – perot57

+1

パンダを使用すると、これはコンパイルされたバックエンドを使用し、1つのライナーになります – maxymoo

答えて

0

パンダが良い選択です。 thisの例を参照してください。

ファイルが大きい場合は、pandasよりもsqliteを優先します。 Pandasデータフレームはsqlite DBからロードできます。

import sqlite3 

file1 = """Gen1 1 1 10 
Gen2 1 2 20 
Gen3 2 30 40""" 

file2 = """A 1 4 
B 1 15 
C 2 2""" 

# your code (fixed) 
print("desired output") 
for i in file1.splitlines(): 
    temp = i.split() 
    for a in file2.splitlines(): 
     temp2 = a.split() 
     if temp[1] == temp2[1] and int(temp2[2]) >= int(temp[2]) and int(temp2[2]) <= int(temp[3]): 
      print(i + " " + a) 


# Make an in-memory db 
# Set a filename if your files are too big or if you want to reuse this db 
con = sqlite3.connect(":memory:") 
c = con.cursor() 

c.execute("""CREATE TABLE file1 
(
    gene_name text, 
    a integer, 
    b1 integer, 
    b2 integer 
)""") 

for row in file1.splitlines(): 
    if row: 
     c.execute("INSERT INTO file1 (gene_name, a, b1, b2) VALUES (?,?,?,?)", tuple(row.split())) 

c.execute("""CREATE TABLE file2 
(
    name text, 
    a integer, 
    b integer 
)""") 

for row in file2.splitlines(): 
    if row: 
     c.execute("INSERT INTO file2 (name, a, b) VALUES (?,?,?)", tuple(row.split())) 

# join tow tables 
print("sqlite3 output") 
for row in c.execute("""SELECT 
    file1.gene_name, 
    file1.a, 
    file1.b1, 
    file1.b2, 
    file2.name, 
    file2.a, 
    file2.b 
FROM file1 
JOIN file2 ON file1.a = file2.a AND file2.b >= file1.b1 AND file2.b <= file1.b2 
"""): 
    print(row) 

con.close() 

出力:

desired output 
Gen1 1 1 10 A 1 4 
Gen2 1 2 20 A 1 4 
Gen2 1 2 20 B 1 15 
sqlite3 output 
(u'Gen1', 1, 1, 10, u'A', 1, 4) 
(u'Gen2', 1, 2, 20, u'A', 1, 4) 
(u'Gen2', 1, 2, 20, u'B', 1, 15) 
関連する問題