0

次のプログラムは約 2 時間実行されており、おそらくあと 1/4 時間かかります。私の質問はコードの下にあります:

import csv

input_csv = "LOCATION_ID.csv"
input2 = "CITIES.csv"
output_csv = "OUTPUT_CITIES.csv"

with open(input_csv, "rb") as infile:
    input_fields = ("ID", "CITY_DECODED", "CITY", "STATE", "COUNTRY", "SPELL1", "SPELL2", "SPELL3")
    reader = csv.DictReader(infile, fieldnames = input_fields)
    with open(input2, "rb") as infile2:
        input_fields2 = ("Latitude", "Longitude", "City")
        reader2 = csv.DictReader(infile2, fieldnames = input_fields2)
        next(reader2)
        words = []
        for next_row in reader2:
            words.append(next_row["City"])

        with open(output_csv, "wb") as outfile:
            output_fields = ("EXISTS","ID", "CITY_DECODED", "CITY", "STATE", "COUNTRY", "SPELL1", "SPELL2", "SPELL3")
            writer = csv.DictWriter(outfile, fieldnames = output_fields)
            writer.writerow(dict((h,h) for h in output_fields))
            next(reader)
            for next_row in reader:
                search_term = next_row["CITY_DECODED"]

                #I think the problem is here where I run through every city
                #in "words", even though all I want to know is if the city
                #in "search_term" exists in "words
                for item in words:
                    if search_term in words:
                        next_row["EXISTS"] = 1

                writer.writerow(next_row)

ここでいくつか質問があります。

1 input_csv には 14,000 行あり、input2 には 6,000 行しかないのに、なぜこんなに時間がかかるのでしょうか? 最も内側の for ループ ("for item in words:" で始まる) が非効率であることは理解しています (qtn 3 を参照)。願わくば、他の SO ユーザー) が、私たちの他のプログラムで同じ過ちを犯すのを避けることができます。

2このコードを引き続き実行したい場合、コンピュータを離れてスリープ/休止状態になることとどのように関連していますか? プログラムはその時点で停止しますが、コンピューターが再び使用されると、自動的に再起動しますか? プログラムを実行すると、コンパイラがオペレーティングシステムとどのように対話するのか、そしてPythonプログラムに関連するコンピュータが「スリープ状態になる」手段は何なのか、本当に疑問に思っています。

そして 3このコードのより効率的な実装は何ですか? これを行うのに数分以上かかるべきではないと考えるのは間違いではありませんよね?

どうもありがとう!

4

1 に答える 1

2

私が見る非効率の1つのスポットから始めましょう:

for next_row in reader:
                search_term = next_row["CITY_DECODED"]
                for item in words:
                    if search_term in words:
                        next_row["EXISTS"] = 1

forこれは、外側のループの 14,000 回の反復です。次に、ネストされたループで毎回約 6k の反復。for次に、返すまで単語を反復するため、より多くの反復が行われます。if search_term in words

このアルゴリズムが実際に何をしているのかについてはあまり考えていませんが、少なくともwords(つまりwords = list(set(words))) の重複を削除する必要があります。

for item in wordsその小さなループについて投稿しようとしていました。なぜあなたがそれをしたのかitems、決して使用されないので、for ループは時間の大きな無駄です。

ほとんどの場合、次のように減らすことができます。

for next_row in reader:
    search_term = next_row["CITY_DECODED"]
    if search_term in words:
        next_row["EXISTS"] = 1
    writer.writerow(next_row)

それで、あなたが持っていたすべての反復を要約しましょう:

〜6kfor next_row in reader2: words.append(next_row["City"])

for next_row in reader:約 2520 億である sum(i,1,6000) による MULTIPLIEDの ~14k 反復。

無関係なループを取り除くと、約 8,400 万回の反復が得られます。これは、はるかに優れています。

于 2013-02-13T21:35:05.413 に答える