質問

私はPythonを使用しているのでこれを尋ねていますが、他の解釈言語(Ruby、PHP、JavaScript)にも適用できます。

コードにコメントを残すたびに通訳を遅くしていますか?通訳についての私の限られた理解によると、それは文字列としてプログラムの表現を読み取り、それらの文字列をコードに変換します。それがコメントを解析するたびに、それは無駄な時間であるようです。

これはそうですか?解釈された言語でのコメントの条約はありますか、それともその効果は無視できますか?

役に立ちましたか?

解決

Pythonの場合、ソースファイルは実行される前にコンパイルされます( .pyc ファイル)、およびコメントはプロセスで剥奪されます。だからコメント たぶん......だろう 数十億個の場合はコンピレーション時間を遅くしますが、実行時間に影響を与えません。

他のヒント

さて、私はこのような短いPythonプログラムを書きました:

for i in range (1,1000000):
    a = i*10

アイデアは、単純な計算荷重を数回行うことです。

タイミングで、実行に0.35±0.01秒かかりました。

次に、このように挿入されたジェームズ王聖書全体でそれを書き直しました:

for i in range (1,1000000):
    """
The Old Testament of the King James Version of the Bible

The First Book of Moses:  Called Genesis


1:1 In the beginning God created the heaven and the earth.

1:2 And the earth was without form, and void; and darkness was upon
the face of the deep. And the Spirit of God moved upon the face of the
waters.

1:3 And God said, Let there be light: and there was light.

...
...
...
...

Even so, come, Lord Jesus.

22:21 The grace of our Lord Jesus Christ be with you all. Amen.
    """
    a = i*10

今回は、実行に0.4±0.05秒かかりました。

答えはそうです はい. 。ループ内の4MBのコメントは測定可能な違いをもたらします。

コメントは通常、解析段階のまたはそれ以前に削除され、解析は非常に速いため、効果的にコメントは初期化時間を遅くしません。

いくつかのコメントでリッチのようなスクリプトを作成しました(約500kbのテキストのみ):

# -*- coding: iso-8859-15 -*-
import timeit

no_comments = """
a = 30
b = 40
for i in range(10):
    c = a**i * b**i
"""
yes_comment = """
a = 30
b = 40

# full HTML from http://en.wikipedia.org/
# wiki/Line_of_succession_to_the_British_throne

for i in range(10):
    c = a**i * b**i
"""
loopcomment = """
a = 30
b = 40

for i in range(10):
    # full HTML from http://en.wikipedia.org/
    # wiki/Line_of_succession_to_the_British_throne

    c = a**i * b**i
"""

t_n = timeit.Timer(stmt=no_comments)
t_y = timeit.Timer(stmt=yes_comment)
t_l = timeit.Timer(stmt=loopcomment)

print "Uncommented block takes %.2f usec/pass" % (
    1e6 * t_n.timeit(number=100000)/1e5)
print "Commented block takes %.2f usec/pass" % (
    1e6 * t_y.timeit(number=100000)/1e5)
print "Commented block (in loop) takes %.2f usec/pass" % (
    1e6 * t_l.timeit(number=100000)/1e5)


C:\Scripts>timecomment.py
Uncommented block takes 15.44 usec/pass
Commented block takes 15.38 usec/pass
Commented block (in loop) takes 15.57 usec/pass

C:\Scripts>timecomment.py
Uncommented block takes 15.10 usec/pass
Commented block takes 14.99 usec/pass
Commented block (in loop) takes 14.95 usec/pass

C:\Scripts>timecomment.py
Uncommented block takes 15.52 usec/pass
Commented block takes 15.42 usec/pass
Commented block (in loop) takes 15.45 usec/pass

Davidのコメントに従って編集:

 -*- coding: iso-8859-15 -*-
import timeit

init = "a = 30\nb = 40\n"
for_ = "for i in range(10):"
loop = "%sc = a**%s * b**%s"
historylesson = """
# <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
# blah blah...
# --></body></html> 
"""
tabhistorylesson = """
    # <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    # blah blah...
    # --></body></html> 
"""

s_looped = init + "\n" + for_ + "\n" + tabhistorylesson + loop % ('   ','i','i')
s_unroll = init + "\n"
for i in range(10):
    s_unroll += historylesson + "\n" + loop % ('',i,i) + "\n"
t_looped = timeit.Timer(stmt=s_looped)
t_unroll = timeit.Timer(stmt=s_unroll)

print "Looped length: %i, unrolled: %i." % (len(s_looped), len(s_unroll))

print "For block takes %.2f usec/pass" % (
    1e6 * t_looped.timeit(number=100000)/1e5)
print "Unrolled it takes %.2f usec/pass" % (
    1e6 * t_unroll.timeit(number=100000)/1e5)


C:\Scripts>timecomment_unroll.py
Looped length: 623604, unrolled: 5881926.
For block takes 15.12 usec/pass
Unrolled it takes 14.21 usec/pass

C:\Scripts>timecomment_unroll.py
Looped length: 623604, unrolled: 5881926.
For block takes 15.43 usec/pass
Unrolled it takes 14.63 usec/pass

C:\Scripts>timecomment_unroll.py
Looped length: 623604, unrolled: 5881926.
For block takes 15.10 usec/pass
Unrolled it takes 14.22 usec/pass

その効果は、日常の使用については怠りません。テストするのは簡単ですが、次のような単純なループを検討する場合は、

For N = 1 To 100000: Next

コンピューターは、それを(100,000まで)処理することができます。特定の文字から始まるテキストの行を無視すると、10,000倍以上速くなります。

ご心配なく。

インタープリターの実装方法に依存します。最も適度に現代的な通訳者は、実際の実行の前にソースコードで少なくとも少し処理することを行います。これには、コメントを削除して、その時点以降に違いをもたらさないことが含まれます。

かつて、メモリが厳しく制約されていた場合(例えば、64kのアドレス指定可能なメモリ、およびストレージ用のカセットテープ)、そのようなことを当たり前のこととは思わなかった。 Apple II、Commodore Pet、TRS-80などの日に戻って、プログラマーが実行速度を改善するためにコメント(および白いスペース)を明示的に削除することはかなり日常的でした。これはまた、当時日常的に採用されていた多くのソースコードレベルのハックの1つでした1.

もちろん、これらのマシンには、一度に1つの命令しか実行できず、クロック速度が約1 MHzで、8ビットプロセッサレジスタしかないCPUがありました。ダンプスターでのみ見つけたマシンでさえ、それよりもはるかに速いです。


1.別の例では、AppleSoftでは、数字の数字に応じて少し速度を獲得または失う可能性があります。メモリが役立つ場合、速度ゲインは、GOTOステートメントのターゲットが16の倍数であった場合でした。

スクリプトが実行可能なフォームに解析されるため、コメントがスタートアップ時間を遅くすることができます。ただし、ほとんどの場合、コメントは実行時間が遅くなりません。

さらに、Pythonでは、.pyファイルを.pycにコンパイルできます。これにはコメントが含まれません(期待する必要があります) - これは、スクリプトが既にコンパイルされている場合、スタートアップヒットも取得できないことを意味します。

通訳についての私の限られた理解は、それが文字列としてプログラムの表現を読み取り、それらの文字列をコードに変換することです。

ほとんどの通訳者はテキスト(コード)を読み、抽象的な構文ツリーデータ構造を作成します。
その構造には、テキスト形式のコードが含まれておらず、もちろんコメントも含まれていません。ちょうどその木はプログラムを実行するのに十分です。しかし、通訳者は、効率的な理由で、さらに一歩進んでバイトコードを作成します。そして、Pythonはまさにそれを行います。

コードとコメントは、あなたが書いた形式で、単に 現在ではない,
プログラムが実行されているとき。いいえ、コメントは実行時にプログラムを遅くしないでください。

(*)テキスト以外のコードを表すために他の内部構造を使用しない通訳、
つまり、構文ツリーは、あなたが言及したことを正確に行う必要があります。実行時にコードを何度も解釈します。

他の答えがすでに述べているように、Pythonの最初の解析とソースをBytecodeにコンパイルし、パーサーは単にコメントを無視しているような最新の解釈言語です。これは、ソースが実際に解析された場合にのみ、スタートアップで速度の損失が発生することを明らかに意味します。

パーサーはコメントを無視しているため、コンパイルフェーズは基本的にあなたが入れたコメントの影響を受けません。しかし、コメント自体のバイトは実際に読まれ、解析中にスキップされています。これは、クレイジーな量のコメント(多くの数百メガバイトなど)がある場合、これにより通訳が遅くなることを意味します。しかし、これもこれにより、どのコンパイラも遅くなります。

コメントがどのように使用されているかについて重要なのだろうか。たとえば、トリプルの引用はドキュストリングです。それらを使用すると、コンテンツが検証されます。私はしばらく前に問題に遭遇し、そこでライブラリをPython 3コードにインポートしていました... nの構文に関するこのエラーが発生しました。私は行番号を見て、それはトリプルの引用コメント内のコンテンツでした。やや驚きました。 Pythonに新しく、構文エラーについてブロックコメントが解釈されるとは思っていませんでした。

入力するだけの場合:

'''
(i.e. \Device\NPF_..)
'''

Python 2はエラーをスローしませんが、Python 3レポート:Syntaxerror :( Unicode Error)「UnicodeEscape」コーデックは位置14-15でバイトをデコードできません:奇形 n文字エスケープ

したがって、Python 3は明らかにトリプルの引用を解釈しており、有効な構文であることを確認しています。

ただし、単一の行に変わった場合コメント:#(ie device npf_ ..)
エラーの結果はありません。

パフォーマンスの変化が見られる場合、トリプルの引用コメントが単一行に置き換えられたのかどうか疑問に思います。

この質問は本当に古いですが、それが実行時間に影響を与えないと主張する受け入れられた答えを読んだ後、それは間違っているので、実行時間に影響を与える量を確認して確認できる簡単な例を提供しています。
私は呼ばれるファイルを持っています constants.py. 。リストにチェスのすべての異なるアクションが含まれています。

LABELS = [ "a1b1"
    "a1c1", 
    "a1d1", 
    "a1e1", 
    "a1f1",....]

リスト LABELS 2272要素が含まれています。別のファイルで私が呼び出す:

import constants
np.array(constants.LABELS)

10回測定し、コードの実行には約0.597ミリ秒かかりました。次に、ファイルを変更し、各要素の隣に挿入されました(2272回)コメント:

LABELS = [ "a1b1",  # 0 
            "a1c1", # 1
            "a1d1", # 2
            "a1e1", # 3
            "a1f1", # 4
             ...,
            "Q@h8", # 2271]

現在、実行時間を測定した後 np.array(constants.LABELS) 10倍、平均実行時間は4.28ミリ秒であるため、約7倍遅くなります。
したがって、はい、多くのコメントがある場合、実行時間に影響を与えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top