Обычно я делаю общую фильтрацию по строкам следующим образом:
criterion = lambda row: row['countries'] not in countries
not_in = df[df.apply(criterion, axis=1)]
В системе x86_64 обе функции могут быть скомпилированы в один и тот же код. Я «замаскировал» разборку примерно эквивалентным кодом C:
f_or_g:
pushq %rbp ; // Standard stack frame setup
movq %rsp, %rbp ; // same
movl OFFSET1(%rip), %eax ; eax = c;
addl OFFSET2(%rip), %eax ; eax += b;
movq OFFSET3(%rip), %rcx ; rcx = &a;
movl %eax, (%rcx) ; *rcx = eax;
popq %rbp ; // Standard stack frame teardown
retq ; return
Так как x86_64 использует eax
в качестве возвращаемого регистра для 32-битных значений, результат добавления находится в «правильном» place ", чтобы вернуть его уже - дополнительный код не требуется.
В более сложных функциях могут быть некоторые незначительные накладные расходы, необходимые для обеспечения возврата возвращаемого значения в правый регистр. Вообще говоря, эти накладные расходы должны быть минимальными.
Тот же принцип применяется к большинству других архитектур - это не относится к x86_64; Я просто использую его, потому что это первый компилятор, который пришел в руки.
Я не думаю, что этот вопрос имеет смысл.
Если вы нуждаетесь в возвращенном значении, у вас нет возможности использовать void
для его ускорения up, даже если будет быстрее. Если вам не нужен результат , бесполезно возвращать его, поэтому просто не делайте этого. В любом случае выбор определяется потребностями вызывающего абонента.
Как правило, современные компиляторы не возвращают значение, а создают его на месте. Например, если вы пишете int sum = f(a,b);
, компилятор никогда не сделает временную функцию, а вместо этого сохранит результат в памяти sum
. Это означает, что нет никакой разницы во времени выполнения.
мы не можем сказать, будет ли использование дополнительных циклов, потому что это зависит исключительно от вашего процессора или процессора, и, кроме того, если вам нужно вернуть значение, то оператор return просто обращается к ячейке памяти этого элемента, поэтому может быть только небольшое изменение в сложности, которое незначительно.
Это полностью зависит от набора команд процессора и вызовов.
Если, например, возвращаемое значение всегда возвращается в конкретном регистре, и компилятор может организовать результат вычисления b + c, чтобы быть в этом конкретном регистре перед вставкой команды возврата, код, сгенерированный для этих двух функций, может быть идентичным.
Однако это не та вещь, о которой вы хотите подумать об оптимизации в вашей программе, если только вы исчерпали все другие варианты улучшения производительности. И вы, конечно, этого не сделали.
eax
(или аналогичный, я думаю, извините, если я просто сказал какую-то глупость!) Не потребует дополнительного кода? – ZenJ 13 July 2018 в 22:20