Вопрос

Я спрашиваю об этом, потому что я использую 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 секунды.

Так что ответ да. Отказ 4 МБ комментариев в цикле делают измеримое значение.

Комментарии обычно удивляются в стадии разбора или перед стадией разбора, а разбор очень быстро, поэтому эффективно комментарии не будут замедлять время инициализации.

Сделал скрипт, как богатые с некоторыми комментариями (только около 500 КБ текст):

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

Редактировать в соответствии с комментарием Дэвида:

 -*- 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 МГц и имели только 8-битные регистры процессора. Даже машина, которую вы теперь найдуте только в мусором намного быстрее, чем те, что это было даже не смешно ...


1. Для другого примера в AppleSoft вы можете получить или потерять небольшую скорость в зависимости от того, как вы пронумеровали строки. Если память служит, усиление скорости было, когда цель оператора GOTO было кратным из 16.

Наличие комментариев замедляется время запуска, так как скрипты будут проанализироваться в исполняемой форме. Однако в большинстве случаев комментарии не замедляют время выполнения.

Кроме того, в Python вы можете компилировать файлы .py в .pyc, который не будет содержать комментарии (я должен надеяться) - это означает, что вы не получите удар запуска, либо если сценарий уже скомпилирован.

Мое ограниченное понимание интерпретатора заключается в том, что он читает выражения программы в качестве строк и преобразует эти строки в код.

Большинство переводчиков читают текст (код) и создают абстрактную структуру данных дерева синтаксиса.
Эта структура не содержит код, в текстовой форме, и, конечно, никаких комментариев тоже. Просто это дерево достаточно для выполнения программ. Но переводчики, по причинам эффективности, пройдите один шаг вперед и дайте код байта. И Python делает именно это.

Мы могли бы сказать, что код и комментарии, в виде вы написали их, просто не присутствует,
Когда программа работает. Так что нет, комментарии не замедляют программы во время выполнения.

(*) Переводчики, которые не используют некоторую другую внутреннюю структуру для представления кода, отличного от текста,
Т.е. синтаксическое дерево, должно сделать именно то, что вы упомянули. Интерпретировать снова и снова код во время выполнения.

Поскольку другие ответы уже указали, современный интерпретированный язык, такой как Python First Parses и компилирует источник в Bytecode, и парсер просто игнорирует комментарии. Это четко означает, что любая потеря скорости происходит только при запуске, когда источник на самом деле проанализирован.

Поскольку парсер игнорирует комментарии, фаза компиляции в основном не зависит от любых комментариев, которые вы ввели. Но байты в самих комментариях фактически читаются, а затем пропущены во время анализа. Это означает, что если у вас есть сумасшедшая сумма комментариев (например, много сотен мегабайт), это замедлит переводчик. Но опять же это тоже замедлит любой компилятор.

Интересно, имеет значение ли это, как комментарии используются. Например, тройные цитаты - это DOCSTRING. Если вы их используете, содержимое подтверждено. Я бежал в проблему некогда назад, где я импортирую библиотеку в мой код Python 3 ... Я получил эту ошибку в отношении синтаксиса на n. Я посмотрел на номер линии, и это было содержание в трехместном комментарии. Я был несколько удивлен. Новый в Python я никогда не думал, что блочный комментарий будет интерпретироваться для синтаксических ошибок.

Просто если вы напечатаете:

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

Python 2 не бросает ошибку, но Python 3 Отчеты: SyntaxError: (Ошибка Unicode) «UnicodeeChape» Codec не может декодировать байты в положении 14-15: неработающий N Escape

Таким образом, Python 3, очевидно, интерпретирует тройную цитату, убедившись, что это действительный синтаксис.

Однако, если он превращается в один комментарий: # (то есть Device NPF_ ..)
Нет результатов ошибок.

Интересно, заменяется ли Triple Quote Comments Wer за счет одной строки, если будет замечено изменение производительности.

Этот вопрос действительно старый, но после прочтения принятого ответа, который утверждает, что он не повлияет на время выполнения, что неверно, я даю вам простой пример, где вы можете увидеть и проверять сумму, которое он влияет на время выполнения.
У меня есть файл под названием constants.py. Отказ Содержит все разные действия шахмат в списке:

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

Список LABELS Содержит 2272 элементов. В другом файле я звоню:

import constants
np.array(constants.LABELS)

Я измерил его десять раз, и выполнение кода занимает около 0,597 мс. Теперь я поменял файл и вставил рядом с каждым элементом (2272 раз) комментарий:

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

Теперь после измерения времени выполнения np.array(constants.LABELS) Десять раз у меня среднее время исполнения 4,28 мс, таким образом, примерно в 7 раз медленнее.
Следовательно, да, это влияет на время выполнения, если у вас много комментариев.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top