Профилирование Python в Eclipse

Как мы видим из справочного источника , BigInteger в .NET использует довольно медленный алгоритм умножения, обычный алгоритм квадратичного времени, использующий 32x32-> 64 умножения. Но он написан с небольшими накладными расходами: итеративный, мало выделений и никаких вызовов не встроенных процедур ASM. Частичные продукты добавляются в результат немедленно, а не материализуются отдельно.

Неинлинируемую процедуру ASM можно заменить встроенной _umul128 . Расчеты ручного переноса (как условного +1, так и определения выходного переноса) могут быть заменены внутренним _addcarry_u64.

Более эффективные алгоритмы, такие как умножение Карацубы и умножение Тоом-Кука, могут быть эффективными, но не тогда, когда рекурсия выполняется полностью вплоть до уровня единственной конечности - это далеко за пределы точки, где накладные расходы перевешивают сохраненные элементарные умножения. Как конкретный пример, эта реализация Java BigInteger переключается на Karatsuba для 80 конечностей (2560 битов, потому что они используют 32-битные конечности) и на 3-стороннюю Toom-Cook для 240 конечностей. Учитывая этот порог в 80, только с 64 конечностями, я бы не ожидал слишком большого усиления в любом случае, если таковой имеется.

11
задан Community 23 May 2017 в 10:27
поделиться

2 ответа

если Вы следуете за общей идиомой Python для создания всего кода, даже "существующих программ", разрешенными к ввозу как модули, Вы могли сделать точно, что Вы описываете без любой дополнительной стычки.

вот определенная идиома, о которой я говорю, который поворачивает поток Вашей программы "вверх тормашками" начиная с __name__ == '__main__' будет помещен у основания файла, однажды все Ваш defs сделаны:

# program.py file

def foo():
    """ analogous to a main().  do something here """
    pass

# ... fill in rest of function def's here ...

# here is where the code execution and control flow will
# actually originate for your code, when program.py is
# invoked as a program.  a very common Pythonism...
if __name__ == '__main__':
    foo()

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

С тех пор существуют другие преимущества для наличия, Вы программируете также модуль, Вы найдете больше всего python сценарии там на самом деле делают это этот путь. Одно преимущество выполнения его этот путь: что-либо python Вы пишете, потенциально применимо в форме модуля, включая cProfile- луг Вашего foo().

4
ответ дан 3 December 2019 в 11:52
поделиться

Можно всегда делать отдельные модули, которые делают просто профильный определенный материал в других модулях. Можно организовать модули как они в отдельном пакете. Тем путем Вы не изменяете свой существующий код.

0
ответ дан 3 December 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: