Frage

Ich frage das, weil ich Python verwenden, aber es könnte auch auf andere interpretierten Sprachen als auch (Rubin, PHP, JavaScript) gilt.

Verlangsamung Bin ich der Dolmetscher nach unten, wenn ich einen Kommentar in meinem Code verlassen? Nach meinem begrenzten Verständnis eines Dolmetschers, liest es Programm Ausdrücke in als Strings und dann diese Strings in einen Code umwandelt. Es scheint, dass jedes Mal, wenn ein Kommentar parst, die Zeit verschwendet wird.

Ist dies der Fall? Gibt es eine Konvention für die Kommentare in interpretierten Sprachen, oder ist der Effekt vernachlässigbar?

War es hilfreich?

Lösung

Für den Fall von Python, Quelldateien kompiliert werden, bevor sie (die .pyc Dateien) ausgeführt wird, und die Kommentare werden in dem Prozess abgezogen. So comments könnte verlangsamen die Kompilierung ab, wenn Sie gazillions von ihnen haben, aber sie werden die Ausführungszeit nicht beeinflussen.

Andere Tipps

Nun, schrieb ich eine kurze Python-Programm wie folgt aus:

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

Die Idee ist, tun eine einfache Berechnung viele Male.

Mit dem Timing, dass es dauerte 0,35 ± 0,01 Sekunden zu laufen.

Ich schreibe es dann mit dem ganzen des Königs James Bible wie folgt eingefügt:

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

Dieses Mal ist es 0,4 ± dauerte 0,05 Sekunden laufen.

Die Antwort ist also Ja . 4MB von Kommentaren in einer Schleife einen messbaren Unterschied machen.

Kommentare werden in der Regel in oder vor dem Parsing-Stadium gezupft und Parsing ist sehr schnell, so effektiv Kommentare werden nicht die Initialisierungszeit verlangsamen.

Haben Sie ein Skript wie Richs mit einigen Kommentaren (nur etwa 500kb Text) bis:

# -*- 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

Bearbeiten laut David Kommentar:

 -*- 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

Der Effekt ist für den täglichen Gebrauch vernachlässigbar. Es ist einfach zu testen, aber wenn Sie eine einfache Schleife betrachten wie zum Beispiel:

For N = 1 To 100000: Next

Der Computer kann so verarbeitet werden, dass (Zählung 100.000) schneller, als Sie blinzeln. Ignorieren eine Textzeile, die beginnt mit einem bestimmten Charakter wird mehr als 10.000-mal schneller.

Mach dir keine Sorgen darüber.

Es hängt davon ab, wie der Interpreter implementiert ist. Die meisten halbwegs moderne Dolmetscher tun zumindest ein wenig Vorverarbeitung auf dem Quellcode, bevor eine tatsächliche Ausführung, und das schließt die Kommentar Strippen aus, so dass sie weiter keinen Unterschied von diesem Punkt zu machen.

Zu einer Zeit, wenn der Speicher stark eingeschränkt wurde (beispielsweise 64K insgesamt adressierbaren Speicher und Kassetten für die Lagerung) Sie nehmen konnten solche Dinge nicht für selbstverständlich halten. Zurück in dem Tag des Apple II, Commodore PET, TRS-80, usw., war es ziemlich Routine für Programmierer explizit entfernen Kommentare (und auch white-space) Ausführungsgeschwindigkeit zu verbessern. Dies war auch nur eine von vielen Quellcode-Ebene Hacks routinemäßig zur Zeit beschäftigt 1 .

Natürlich ist es auch dazu beigetragen, dass diese Maschinen hatten CPUs, die nur eine Anweisung zu einem Zeitpunkt ausgeführt werden konnten, mußten Taktgeschwindigkeiten um 1 MHz und hatten nur 8-Bit-Prozessor-Register. Selbst eine Maschine jetzt nur in einer Mülltonne finden würde, ist so viel schneller als diejenigen waren, dass es auch nicht lustig ...


1. Für ein weiteres Beispiel, in Apple könnten Sie gewinnen oder ein wenig Geschwindigkeit je verlieren, wie Sie Zeilen nummeriert. Wenn der Speicher dient, war die Geschwindigkeitsverstärkung, wenn das Ziel einer goto-Anweisung ein Vielfaches von 16 war.

Mit Kommentaren werden die Startzeit verlangsamen, da die Skripte in eine ausführbare Form erhalten analysiert werden. Allerdings Kommentare in den meisten Fällen nicht langsam nach unten Laufzeit.

Zusätzlich in Python, können Sie die Py-Dateien in .pyc kompilieren, die die Kommentare nicht enthalten (ich hoffe soll) - dies bedeutet, dass Sie nicht ein Start-up entweder getroffen zu werden, wenn das Skript bereits kompiliert wird.

mein begrenztes Verständnis eines Interpreter ist, dass es liest Programm Ausdrücke in als Strings und konvertiert diese Strings in dem Code.

Die meisten Dolmetscher lesen Sie den Text (Code) und erzeugen eine Abstract Syntax-Baum-Datenstruktur.
Diese Struktur enthält keinen Code, in Textform, und natürlich keine Kommentare auch nicht. Nur dieser Baum ist genug für die Ausführung von Programmen. Aber Dolmetscher aus Effizienzgründen, gehen einen Schritt weiter und produzieren Bytecode. Und Python tut genau das.

Wir könnten sagen, dass der Code und die Kommentare in Form man sie schrieb, sind einfach nicht vorhanden ,
wenn das Programm ausgeführt wird. Also nein, Kommentare nicht verlangsamen die Programme zur Laufzeit.

(*) Dolmetscher, die den Code anders als Text zu repräsentieren nicht eine andere innere Struktur verwenden, um
dh einen Syntaxbaum, muss genau das tun, was Sie genannt haben. Interpretieren Sie immer wieder den Code zur Laufzeit.

Wie die anderen Antworten bereits erwähnt, eine modern interpretierte Sprache wie Python erste Parsen und kompiliert die Quelle in Bytecode, und der Parser ignoriert einfach die Kommentare. Anschaulich bedeutet dies, dass der Verlust der Geschwindigkeit nur beim Start auftreten würde, wenn die Quelle tatsächlich analysiert wird.

Da die Parser Kommentare ignorieren, ist die Kompilierung Phase grundsätzlich unbeeinflusst von irgendwelchen Kommentaren Sie in. Aber das Bytes in den Kommentaren sind sich tatsächlich in gelesen, und dann übersprungen während der Analyse über. Das bedeutet, dass, wenn Sie eine verrückte Menge von Kommentaren haben (zum Beispiel vieler hundert Megabyte), würde dies den Interpreter verlangsamen. Aber dann wieder würde dies langsam jeden Compiler als auch.

Ich frage mich, wenn es darauf ankommt, wie Kommentare verwendet werden. Zum Beispiel ist dreifache Anführungszeichen ein docstring. Wenn Sie sie verwenden, wird der Inhalt validiert. Ich in ein Problem lief eine Weile zurück, wo ich eine Bibliothek in meinen Python 3-Code importieren ... Ich habe diesen Fehler in Bezug auf Syntax auf \ N. Ich schaute auf die Zeilennummer und es war Inhalt innerhalb eines dreifachen Zitat Kommentar. Ich war etwas überrascht. Neu bei Python, ich hätte nie gedacht, ein Block Kommentar würde auf Syntaxfehler interpretiert werden.

Sie einfach, wenn Sie Folgendes eingeben:

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

Python 2 keinen Fehler werfen, aber Python 3 Berichte: Syntax: (Unicode-Fehler) 'unicodeescape' Codec kann nicht dekodieren Bytes in Position 14-15: malformed \ N Zeichen escape

So Python 3 Interpretation offenbar die dreifache Quote sicher Syntax es ist gültig zu machen.

Wenn jedoch in einer einzigen Zeile Kommentar gedreht: # (d \ Device \ NPF_ ..)
Keine Fehler auf.

Ich frage mich, ob die dreifache Zitat Kommentare Wer mit einzelnen Linien ersetzt, wenn eine Leistungsänderung gesehen werden würde.

Diese Frage ist wirklich alt, aber nach der akzeptierten Antwort zu lesen, die behaupten, dass es nicht die Ausführungszeit auswirken wird, was falsch ist, gebe ich Ihnen ein einfaches Beispiel, wo Sie die Menge sehen und überprüfen können beeinflusst es die Ausführung Zeit in der Tat.
Ich habe eine Datei mit dem Namen constants.py. Es enthält alle verschiedenen Aktionen des Schachs in einer Liste:

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

Die Liste LABELS enthält 2272 Elemente. In einem anderen Datei-I Aufruf:

import constants
np.array(constants.LABELS)

maß ich es zehnmal und die Ausführung des Codes dauert etwa 0,597 ms. Nun änderte ich die Datei und neben jedem Element (2272-mal) ein Kommentar eingefügt:

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

Jetzt, nach der Ausführungszeit von np.array(constants.LABELS) zehnmal messen, ich habe eine durchschnittliche Ausführungszeit von 4,28 ms, also etwa 7-mal langsamer.
Deshalb ja, es wirkt sich auf die Ausführungszeit, wenn Sie viele Kommentare.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top