1

簡単に言えば。より良いもの:

イテレータを指定すると、次のようになります。CSV を読み取った後、または DB からクエリ結果を取得した後。パフォーマンスを向上させるものとその理由は何ですか?

最初のアプローチ: イテレータを使用して反復し、必要なリストに追加します。何かのようなもの:

element1_list=[]
element2_list=[]
for row in rows:
    element1_list.append(row[element1_index])
    element2_list.append(row[element2_index])

2 番目のアプローチ: イテレータをリストに変換し、事前割り当て後に要素にアクセスする

row_list=list(rows)
length=len(row_list)
element1_list=[None]*length
element2_list=[None]*length
for i in range(0,length):
    element1_list[i]=row_list[i][element1_index]
    element2_list[i]=row_list[i][element2_index]

事前割り当てには独自の利点があります。しかし、リストへの変換自体が反復そのものである可能性があります。では、どのようなアプローチを選択し、その理由は? ボンネットの下で何が起こっているかを知るのは興味深いでしょうか?

EDIT : 繰り返しますが、これらのアプローチの根本的な違いについて知りたいと思います。単にtimeitを使用して実証分析を行うのではなく、理論を裏付けるために行いたいのであって、その逆ではありません

いくつかのパフォーマンス基準は次のとおりです。

  1. 速度と CPU 時間
  2. メモリー
4

1 に答える 1

0

誰もがtimeitを推奨しているので、結果と付随するコードを以下に示します。結果

テストに使用したコードは次のとおりです。

import timeit
import matplotlib.pyplot as plt
import csv

index_element_1=0
index_element_2=2

def create_csv(num_records):
    '''Creates a test CSV'''
    a=open('test.csv','wb')
    a.write("10,20,30,40,50\n"*num_records)
    a.close()

def read_csv(filename):
    '''Returns iterator'''
    cr = csv.reader(open(filename,"rb"))
    return cr

def convert_to_list_method():
    global csv_iterator
    csv_list=list(csv_iterator)
    length_list=len(csv_list)
    x=[None]*length_list
    y=[None]*length_list
    for i in range(0,length_list):
        x[i]=csv_list[index_element_1]
        y[i]=csv_list[index_element_2]
    return [x,y]

def iterate_and_append_method():
    global csv_iterator
    x=[]
    y=[]
    for row in csv_iterator:
        x.append(row[index_element_1])
        y.append(row[index_element_2])
    return [x,y]


CSV_SIZE=range(10000,1010000,10000)
time_convert_to_list=[0]*len(CSV_SIZE)
time_iterate=[0]*len(CSV_SIZE)
count=0

for csv_size in CSV_SIZE:
    create_csv(csv_size)
    global csv_iterator
    csv_iterator=read_csv('test.csv')
    time_convert_to_list[count]=timeit.timeit("convert_to_list_method()", setup="from __main__ import *",number=1)
    csv_iterator=read_csv('test.csv')
    time_iterate[count]=timeit.timeit("iterate_and_append_method()", setup="from __main__ import *",number=1)
    count=count+1

plt.xlabel('CSV Size')
plt.ylabel('Time (s)')
plt.plot(CSV_SIZE,time_convert_to_list,label='Convert to List')
plt.plot(CSV_SIZE,time_iterate,label='Iterate')
plt.legend()
plt.show()

結果はあまり変わりません。どの意見も正しかったと思います。それは実際には大きな違いはありません。

注意: 前の反復で消費されたので、o/w イテレータを再作成する必要があるため、timeit で各関数の反復を 1 回だけ使用しました。

于 2013-04-27T04:26:11.507 に答える