Порядок свойств в нормальных объектах является сложным объектом в Javascript.
Хотя в ES5 явно не указан порядок, ES2015 имеет порядок в определенных случаях. Это следующий объект:
o = Object.create(null, {
m: {value: function() {}, enumerable: true},
"2": {value: "2", enumerable: true},
"b": {value: "b", enumerable: true},
0: {value: 0, enumerable: true},
[Symbol()]: {value: "sym", enumerable: true},
"1": {value: "1", enumerable: true},
"a": {value: "a", enumerable: true},
});
Это приводит к следующему порядку (в некоторых случаях):
Object {
0: 0,
1: "1",
2: "2",
b: "b",
a: "a",
Symbol(): "sym"
}
Таким образом, существует три сегмента, которые могут изменить порядок вставки (как это произошло в пример). И целые ключи не придерживаются порядка вставки.
Вопрос в том, какие методы этот порядок гарантирован в спецификации ES2015?
Следующие методы гарантируют показанный порядок:
Следующие методы / петли не гарантируют никакого порядка:
Вывод: даже в ES2015 вы не должны полагаться на порядок свойств нормального объектов в Javascript. Он подвержен ошибкам. Вместо этого используйте Map
.
Самый простой способ в Python :
import time
start_time = time.time()
main()
print("--- %s seconds ---" % (time.time() - start_time))
Предполагается, что выполнение вашей программы занимает не менее десятой доли секунды.
Выводит:
--- 0.764891862869 seconds ---
Решение rogeriopvl работает нормально, но если вам нужна более конкретная информация, вы можете использовать встроенный профилировщик Python. Проверьте эту страницу:
Еще лучше для Linux: / usr / bin / time
$ /usr/bin/time -v python rhtest2.py
Command being timed: "python rhtest2.py"
User time (seconds): 4.13
System time (seconds): 0.07
Percent of CPU this job got: 91%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.58
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 15
Minor (reclaiming a frame) page faults: 5095
Voluntary context switches: 27
Involuntary context switches: 279
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
Обычно только time
представляет собой более простую встроенную оболочку, которая затеняет более способную /usr/bin/time
.
import time
start_time = time.clock()
main()
print time.clock() - start_time, "seconds"
time.clock ()
возвращает время процессора, что позволяет нам вычислять только время, используемое этим процессом (в любом случае в Unix). В документации говорится: «В любом случае, это функция, которую нужно использовать для тестирования Python или алгоритмов синхронизации»
Я поставил этот модуль Timing.py
в мой собственный каталог site-packages
и просто вставьте import Timing
в верхнюю часть моего модуля:
import atexit
from time import clock
def secondsToStr(t):
return "%d:%02d:%02d.%03d" % \
reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
[(t*1000,),1000,60,60])
line = "="*40
def log(s, elapsed=None):
print line
print secondsToStr(clock()), '-', s
if elapsed:
print "Elapsed time:", elapsed
print line
print
def endlog():
end = clock()
elapsed = end-start
log("End Program", secondsToStr(elapsed))
def now():
return secondsToStr(clock())
start = clock()
atexit.register(endlog)
log("Start Program")
Я также могу вызвать Timing.log
изнутри мою программу, если в программе есть значимые этапы, которые я хочу показать. Но просто включение времени импорта
напечатает время начала и окончания, а также общее прошедшее время. (Простите мою непонятную функцию secondsToStr
, она просто форматирует число секунд с плавающей запятой в форме hh: mm: ss.sss.)
Примечание. Можно найти версию вышеуказанного кода для Python 3 здесь или здесь .
] В Linux или UNIX:
time python yourprogram.py
В Windows см. Это обсуждение Stackoverflow: Как измерить время выполнения команды в командной строке Windows?