Время, потраченное импортом в Python

У вас есть очевидная опечатка в вашем printf("main/n");, а не printf("main\n"); (или просто puts("main");), но это деталь, а не причина, по которой ваша программа никогда не завершит

в vlakno1 вы создаете тупик, выполняя:

    if(poc_precitanych == 0){
        pthread_exit(NULL);
    }

, потому что вы не разблокируете мьютекст, должно быть

    if(poc_precitanych == 0){
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);
    }

у вас та же проблема в vlakno2 [1117 ]:

    if(pocet_pisanych == 0){
        pthread_exit(NULL);
    }

должно быть

    if(pocet_pisanych == 0){
        pthread_mutex_unlock(&mutex);
        pthread_exit(NULL);
    }

Следующее также странно:

    pocet_pisanych = fwrite(a, sizeof(char),poc_precitanych, stdout);

    if(pocet_pisanych == 0){
        pthread_exit(NULL);
    }

даже это не невозможно, трудно иметь запись на stdou безуспешно. Таким образом, единственный шанс для вас выйти из этого цикла - получить poc_precitanych со значением 0

Дополнительное замечание, вы #define V 300, но вы делаете char a[300];, пока используете V в другом месте. Лучше сделать char a[V]; или использовать sizeof(a) в другом месте без определения V


Примеры выполнения после изменений:

/tmp % ./a.out < /dev/null
main
vlakno 1vlakno 2

читать нечего, поэтому poc_precitanych значения 0 и два потока заканчиваются, но

/tmp % echo "1 2 3" | ./a.out
main
vlakno 1vlakno 1vlakno 21 2 3
^C
11
задан Paolo Bergantino 23 April 2009 в 06:05
поделиться

4 ответа

Использовать cProfile:

python -m cProfile yourscript.py
1
ответ дан 3 December 2019 в 06:22
поделиться

Протестировано на Windows в Python 2.4 - вы можете попробовать сами.

>>> import time

>>> ## Built-in module
>>> def testTime():
        now = time.clock() # use time.time() on unix-based systems
        import math
        print time.clock() - now

>>> testTime()
7.54285810167e-006



>>> ## My own module
>>> def testTime():
        now = time.clock()
        import myBuiltInModule # Not its actual name ;-)
        print time.clock() - now

>>> testTime()
0.00253174635324
>>> testTime()
3.70158777141e-006

Таким образом, существует большая разница между кэшированными модулями и теми, которые вводятся с нуля. Чтобы проиллюстрировать это, мы можем перезагрузить модуль:

>>> def testTime():
        now = time.clock()
        reload(myBuiltInModule )
        print time.clock() - now


>>> testTime()
0.00250017809526
0
ответ дан 3 December 2019 в 06:22
поделиться

Вы можете проверить этот забег

$ time python -c "import math"

Однако, что бы это вам помогло? Импорт происходит только один раз и почти никогда не будет бутылочным горлышком. Импорт одного и того же модуля снова и снова не будет выполняться значительно медленнее, чем импорт одного раза, поскольку Python отслеживает, какие модули уже были импортированы.

Чего вы на самом деле пытаетесь достичь?

5
ответ дан 3 December 2019 в 06:22
поделиться

Это не плагин Rails, но http://www.owasp.org/ - хорошее место для начала.

$ python -m cProfile -o myscript.prof myscript.py
$ python gprof2dot.py -o myscript.dot -f pstats myscript.prof
$ dot -Tpng -o profile.png prof_runtest.dot -Gbgcolor=black

Пример выходных данных (1429x1896px PNG)

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

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