{"id":2096,"date":"2018-12-20T00:00:03","date_gmt":"2018-12-19T15:00:03","guid":{"rendered":"https:\/\/blog.ymyzk.com\/?p=2096"},"modified":"2019-12-15T16:56:57","modified_gmt":"2019-12-15T07:56:57","slug":"how-wsgi-lineprof-works","status":"publish","type":"post","link":"https:\/\/blog.ymyzk.com\/2018\/12\/how-wsgi-lineprof-works\/","title":{"rendered":"Python \u30a6\u30a7\u30d6\u30a2\u30d7\u30ea\u306e\u305f\u3081\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9 wsgi_lineprof \u306e\u4ed5\u7d44\u307f"},"content":{"rendered":"\n
\u3053\u306e\u8a18\u4e8b\u306f CAMPHOR- Advent Calendar 2018<\/a> 20\u65e5\u76ee\u306e\u8a18\u4e8b\u3067\u3059\uff0e\u6628\u65e5\u306e\u8a18\u4e8b\u306f @lotz<\/a> \u6c0f\u306e\u300c“\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u3053\u3046\u3057\u3093”\u306e\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u3092Haskell\u3067\u5b9f\u88c5\u3059\u308b<\/a>\u300d\u3067\u3057\u305f\uff0e<\/p>\n\n\n\n wsgi_lineprof<\/a> \u306f WSGI \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3068\u3057\u3066\u5b9f\u88c5\u3055\u308c\u305f Python \u306e\u30e9\u30a4\u30f3\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u3067\u3059\uff0e\u3053\u306e\u8a18\u4e8b\u3067\u306f wsgi_lineprof \u304c\u3069\u306e\u3088\u3046\u306b\u3057\u3066\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b\u304b\u3092\uff0cWSGI \u3084 CPython \u306e\u5185\u90e8\u5b9f\u88c5\u306e\u7c21\u5358\u306a\u8aac\u660e\u3068\u3068\u3082\u306b\u7d39\u4ecb\u3057\u307e\u3059\uff0e\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u306e\u5b9f\u88c5\u306b\u3064\u3044\u3066\u8208\u5473\u304c\u3042\u308b\u4eba\u3084\uff0cPython \u51e6\u7406\u7cfb\uff0cWSGI \u306e\u88cf\u5074\u306b\u8208\u5473\u304c\u3042\u308b\u4eba\u306e\u53c2\u8003\u306b\u306a\u308c\u3070\u5e78\u3044\u3067\u3059\uff0e<\/p>\n\n\n\n\n\n\n\n \u307e\u305a\u7c21\u5358\u306b wsgi_lineprof \u3092\u7d39\u4ecb\u3057\u307e\u3059\uff0ewsgi_lineprof \u306f\u4e0a\u3067\u3082\u8ff0\u3079\u305f\u3088\u3046\u306b WSGI \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3068\u3057\u3066\u5b9f\u88c5\u3055\u308c\u305f Python \u306e\u30e9\u30a4\u30f3\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9<\/strong>\u3067\u3059\uff0e\u30e9\u30a4\u30f3\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u3068\u3044\u3046\u306e\u306f\uff0c\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306e\u884c\u5358\u4f4d\u3067\u5b9f\u884c\u306b\u304b\u304b\u3063\u305f\u6642\u9593\u3092\u8a08\u6e2c\u3067\u304d\u308b\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u3067\u3059\uff0e\u5b9f\u969b\u306b wsgi_lineprof \u304c\u51fa\u529b\u3057\u305f\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u7d50\u679c\u3092\u4ee5\u4e0b\u306b\u793a\u3057\u307e\u3059\uff0e<\/p>\n\n\n\n \u3053\u306e\u7d50\u679c\u304b\u3089\uff0c\u30d7\u30ed\u30b0\u30e9\u30e0\u306e9\u884c\u76ee\u306f 21,891 \u56de\u5b9f\u884c\u3055\u308c\uff0c7,153\u03bcs \u304b\u304b\u3063\u305f\u3053\u3068\u304c\u5206\u304b\u308a\u307e\u3059\uff0e\u3053\u306e\u95a2\u6570\u306e\u5b9f\u884c\u306b\u304b\u304b\u3063\u305f\u6642\u9593\u306e\u3046\u3061\uff0c49.6% \u306e\u6642\u9593\u304c9\u884c\u76ee\u306e\u5b9f\u884c\u306b\u5229\u7528\u3055\u308c\u3066\u3044\u307e\u3059\uff0e\u3053\u306e\u3088\u3046\u306b wsgi_lineprof \u3092\u4f7f\u3046\u3068\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306e\u884c\u5358\u4f4d\u3067\u3069\u306e\u90e8\u5206\u3067\u6642\u9593\u304c\u304b\u304b\u3063\u305f\u304b\u3092\u7c21\u5358\u306b\u77e5\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff0e<\/p>\n\n\n\n \u3053\u306e\u8a18\u4e8b\u3067\u306f wsgi_lineprof \u306e\u5b9f\u88c5\u306b\u3064\u3044\u3066\u4e3b\u306b\u7d39\u4ecb\u3059\u308b\u305f\u3081\uff0cwsgi_lineprof \u81ea\u4f53\u306e\u4f7f\u3044\u65b9\u306b\u3064\u3044\u3066\u306f\u8a73\u3057\u304f\u7d39\u4ecb\u3057\u307e\u305b\u3093\uff0e\u8208\u5473\u306e\u3042\u308b\u65b9\u306f\uff0c\u904e\u53bb\u306e\u8a18\u4e8b<\/a>\u3084 GitHub<\/a> \u3092\u53c2\u7167\u3057\u3066\u4e0b\u3055\u3044\uff0e<\/p>\n\n\n\n wsgi_lineprof \u306f\u5927\u304d\u304f\u5206\u3051\u30663\u3064\u306e\u90e8\u5206\u304b\u3089\u51fa\u6765\u3066\u3044\u307e\u3059\uff0e\u305d\u308c\u305e\u308c\u306e\u90e8\u54c1\u3068\u305d\u306e\u5f79\u5272\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\uff0e<\/p>\n\n\n\n \u3053\u306e\u8a18\u4e8b\u3067\u306f\u305d\u308c\u305e\u308c\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306b\u3064\u3044\u3066\uff0c\u4f55\u3092\u3057\u3066\u3044\u308b\u306e\u304b\uff0c\u3069\u306e\u3088\u3046\u306b\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b\u306e\u304b\u3092\u7d39\u4ecb\u3057\u3066\u3044\u304d\u307e\u3059\uff0e<\/p>\n\n\n\n wsgi_lineprof \u306f HTTP \u30ea\u30af\u30a8\u30b9\u30c8\u304c\u59cb\u307e\u3063\u305f\u30bf\u30a4\u30df\u30f3\u30b0\u3067\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u3092\u958b\u59cb\u3057\uff0c\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u51e6\u7406\u304c\u5b8c\u4e86\u3057\u305f\u30bf\u30a4\u30df\u30f3\u30b0\u3067\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u3092\u7d42\u4e86\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff0eWSGI \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3068\u3057\u3066\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\uff0c\u7279\u5b9a\u306e\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306b\u7e1b\u3089\u308c\u305a\uff0c\u69d8\u3005\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u3092\u5229\u7528\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u3066\u3044\u307e\u3059\uff0e<\/p>\n\n\n\n WSGI (Web Server Gateway Interface) \u306f Python \u306b\u304a\u3051\u308b Web \u30b5\u30fc\u30d0\u30fc\u3068 Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u63a5\u7d9a\u3059\u308b\u305f\u3081\u306e\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u3067\u3059\uff0ePEP 333<\/a>\/PEP 3333<\/a> \u3067\u5b9a\u3081\u3089\u308c\u3066\u304a\u308a\uff0c\u591a\u304f\u306e Web \u30b5\u30fc\u30d0\u30fc\u3084 Web \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af (WAF) \u3067\u63a1\u7528\u3055\u308c\u3066\u3044\u307e\u3059\uff0e \u3044\u304f\u3064\u304b\u5177\u4f53\u4f8b\u3092\u6319\u3052\u3066\u307f\u307e\u3059:<\/p>\n\n\n\n \u4ed6\u306e\u8a00\u8a9e\u3067\u985e\u4f3c\u3059\u308b\u6280\u8853\u3068\u3057\u3066\u306f Java \u306e Servlet \u3084 Perl \u306e PSGI\uff0cRuby \u306e Rack \u306a\u3069\u304c\u3042\u308a\u307e\u3059\uff0e<\/p>\n\n\n\n \u3053\u3053\u3067\uff0cWSGI \u306e\u4ed5\u69d8\u3092\u7c21\u5358\u306b\u7406\u89e3\u3059\u308b\u305f\u3081\u306b\uff0c\u5358\u7d14\u306a WSGI \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3059\uff0e<\/p>\n\n\n\n WSGI \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4ed5\u69d8\u306f\u3068\u3066\u3082\u5358\u7d14\u3067\uff0c\u57fa\u672c\u7684\u306b\u306f\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u60c5\u5831\u7b49\u304c\u542b\u307e\u308c\u305f2\u3064\u306e\u5f15\u6570\u3092\u53d6\u308a\uff0c bytes \u306e iterable \u3092\u8fd4\u3059 callable (\u95a2\u6570\u306a\u3069) \u3067\u3059\uff0e\u3053\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306f Python \u6a19\u6e96\u306b\u542b\u307e\u308c\u3066\u3044\u308b WSGI \u7528\u306e\u30b5\u30fc\u30d0\u30fc\u3067\u52d5\u304b\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff0e\u6b21\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u5b9f\u884c\u3057\u3066\uff0c\u30d6\u30e9\u30a6\u30b6\u7b49\u3067 http:\/\/127.0.0.1:8000\/ \u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068 “hello, world” \u304c\u8fd4\u3063\u3066\u304f\u308b\u3053\u3068\u304c\u78ba\u8a8d\u3067\u304d\u308b\u3068\u601d\u3044\u307e\u3059\uff0e<\/p>\n\n\n\n WSGI \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306f\u30b5\u30fc\u30d0\u30fc\u3068\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u9593\u306b\u5165\u308c\u308b\u3053\u3068\u304c\u51fa\u6765\u308b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3067\uff0c\u30ea\u30af\u30a8\u30b9\u30c8\u3084\u30ec\u30b9\u30dd\u30f3\u30b9\u306b\u5bfe\u3057\u3066\u69d8\u3005\u306a\u51e6\u7406\u3092\u884c\u3046\u305f\u3081\u306b\u5229\u7528\u3067\u304d\u307e\u3059\uff0e\u4f7f\u7528\u4f8b\u3068\u3057\u3066\u306f\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u30fb\u30ed\u30ae\u30f3\u30b0\u30fb\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u306a\u3069\u304c\u4e0a\u3052\u3089\u308c\u307e\u3059\uff0e<\/p>\n\n\n\n \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306f WSGI \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u5f15\u6570\u306b\u3068\u3063\u3066\uff0cWSGI \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u8fd4\u3059 callable \u3068\u3057\u3066\u5b9a\u7fa9\u3059\u308b\u3053\u3068\u304c\u51fa\u6765\u307e\u3059\uff0e(\u95a2\u6570\u578b\u8a00\u8a9e\u306b\u9020\u8a63\u304c\u6df1\u3044\u65b9\u306b\u306f\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306f\u9ad8\u968e\u95a2\u6570\u3068\u3044\u3046\u3068\u308f\u304b\u308a\u3084\u3059\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\uff0e\u307e\u305f Python \u306e\u30c7\u30b3\u30ec\u30fc\u30bf\u306e\u5b9a\u7fa9\u306b\u3082\u4f3c\u3066\u3044\u307e\u3059\uff0e) \u4ee5\u4e0b\u306e\u4f8b\u306f\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u51e6\u7406\u524d\u5f8c\u306b “Before” \u3068 “After” \u3068\u3044\u3046\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8868\u793a\u3059\u308b\u5358\u7d14\u306a\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3067\u3059\uff0e<\/p>\n\n\n\n WSGI \u3084 WSGI \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306b\u3064\u3044\u3066\u306f\u300cWSGI\u3068Python\u3067\u30b9\u30de\u30fc\u30c8\u306aWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u3092<\/a>\u300d\u3068\u3044\u3046\u7279\u96c6\u304c\u3088\u304f\u307e\u3068\u307e\u3063\u3066\u3044\u308b\u3068\u601d\u3044\u307e\u3059\uff0e<\/p>\n\n\n\n wsgi_lineprof \u306e WSGI \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306f\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u51e6\u7406\u958b\u59cb\u6642\u306b\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u3092\u958b\u59cb\u3057\uff0c\u7d42\u4e86\u6642\u306b\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u3092\u505c\u6b62\u3059\u308b\u3088\u3046\u306b\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u3059\uff0e<\/p>\n\n\n\n \u307e\u305f\uff0c\u73fe\u6642\u70b9\u3067\u306f\u5b9f\u88c5\u3067\u304d\u3066\u3044\u307e\u305b\u3093\u304c\uff0c\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3092\u62e1\u5f35\u3059\u308b\u3053\u3068\u3067\u7279\u5b9a\u306e URL (\u4f8b: \/_wsgi_lineprof) \u306b\u30a2\u30af\u30bb\u30b9\u3055\u308c\u305f\u3068\u304d\u306b\uff0c\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u7d50\u679c\u3092 HTTP \u7d4c\u7531\u3067\u8fd4\u3059\u3068\u3044\u3063\u305f\u3053\u3068\u3082\u51fa\u6765\u305d\u3046\u3067\u3059\uff0e<\/p>\n\n\n\n \u6b21\u306b wsgi_lineprof \u306e\u4e2d\u5fc3\u306b\u3042\u305f\u308b\uff0c\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u884c\u6bce\u306e\u5b9f\u884c\u6642\u9593\u3092\u6e2c\u5b9a\u3059\u308b\u30e9\u30a4\u30f3\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u306e\u90e8\u5206\u306e\u5b9f\u88c5\u306b\u3064\u3044\u3066\u7d39\u4ecb\u3057\u307e\u3059\uff0ewsgi_lineprof \u306e\u30e9\u30a4\u30f3\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u306f rkern\/line_profiler<\/a> \u3092\u5143\u306b\u5b9f\u88c5\u3057\u3066\u3044\u307e\u3059\uff0e<\/p>\n\n\n\n \u6ce8\u610f: \u3053\u306e\u7bc0\u3067\u7d39\u4ecb\u3059\u308b\u65b9\u6cd5\u306f Python \u306e\u5b9f\u88c5\u306e\u4e00\u3064\u3067\u3042\u308a\u6a19\u6e96\u5b9f\u88c5\u3067\u3042\u308b CPython \u3092\u524d\u63d0\u3068\u3057\u3066\u3044\u307e\u3059\uff0e\u4ed6\u306e Python \u51e6\u7406\u7cfb\u3067\u306f\u3053\u306e\u7bc0\u3067\u8aac\u660e\u3055\u308c\u305f\u5185\u5bb9\u304c\u5229\u7528\u3067\u304d\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\uff0e<\/p>\n\n\n\n \u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u304c\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5b9f\u884c\u6642\u9593\u3092\u53d6\u5f97\u3059\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8003\u3048\u307e\u3059\uff0e<\/p>\n\n\n\n Python \u306f\u6a19\u6e96\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u3068\u3057\u3066 profile\/cProfile<\/a> \u3092\u63d0\u4f9b\u3057\u3066\u3044\u307e\u3059\uff0e\u3053\u308c\u306f\u95a2\u6570\u5358\u4f4d\u3067\u306e\u5b9f\u884c\u6642\u9593\u3084\u5b9f\u884c\u56de\u6570\u306e\u30c7\u30fc\u30bf\u3092\u63d0\u4f9b\u3057\u3066\u304f\u308c\u307e\u3059\u304c\uff0c\u884c\u5358\u4f4d\u306e\u5b9f\u884c\u6642\u9593\u3092\u5f97\u308b\u306e\u306b\u306f\u4e0d\u5341\u5206\u3067\u3059\uff0e<\/p>\n\n\n\n \u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u306e trace \u30e2\u30b8\u30e5\u30fc\u30eb<\/a>\u306f\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u3069\u306e\u884c\u304c\u5b9f\u884c\u3055\u308c\u305f\u304b\u306e\u30ab\u30d0\u30ec\u30c3\u30b8\u7b49\u3092\u53d6\u5f97\u3059\u308b\u3053\u3068\u304c\u51fa\u6765\u308b\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3059\uff0e\u884c\u5358\u4f4d\u3067\u30c7\u30fc\u30bf\u3092\u3068\u308b\u3053\u3068\u306f\u51fa\u6765\u307e\u3059\u304c\uff0c\u5b9f\u969b\u306b\u3042\u308b\u884c\u306e\u5b9f\u884c\u306b\u3069\u308c\u304f\u3089\u3044\u306e\u6642\u9593\u304c\u304b\u304b\u3063\u305f\u304b\u306f\u8a18\u9332\u3067\u304d\u307e\u305b\u3093\uff0e<\/p>\n\n\n\n trace \u30e2\u30b8\u30e5\u30fc\u30eb\u4e2d\u3067\u3082\u5229\u7528\u3055\u308c\u3066\u3044\u308b\uff0csys \u30e2\u30b8\u30e5\u30fc\u30eb\u306e settrace<\/a> \u306f Python \u306e\u51e6\u7406\u7cfb\u306e\u30c8\u30ec\u30fc\u30b9\u306b\u4f7f\u3046\u305f\u3081\u306e\u95a2\u6570 (\u30c8\u30ec\u30fc\u30b9\u95a2\u6570) \u3092\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u304c\u51fa\u6765\u307e\u3059\uff0e\u30c8\u30ec\u30fc\u30b9\u95a2\u6570\u306f “call”\u30fb”line”\u30fb”return” \u306a\u3069\u306e\u30a4\u30d9\u30f3\u30c8\u304c\u767a\u751f\u3059\u308b\u305f\u3073\u306b\u547c\u3070\u308c\u307e\u3059\uff0e\u3053\u306e\u30c8\u30ec\u30fc\u30b9\u95a2\u6570\u3068\u3057\u3066\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4e00\u884c\u5b9f\u884c\u3059\u308b\u306e\u306b\u304b\u304b\u3063\u305f\u6642\u9593\u3092\u8a18\u9332\u3059\u308b\u51e6\u7406\u3092\u5b9f\u88c5\u3059\u308c\u3070\uff0c\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5b9f\u884c\u306b\u304b\u304b\u3063\u305f\u6642\u9593\u304c\u53d6\u5f97\u3067\u304d\u305d\u3046\u3067\u3059\uff0e\u4ee5\u4e0b\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f7f\u3063\u3066 \u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u5b9f\u884c\u3059\u308b\u3068\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u7d50\u679c\u304c\u5f97\u3089\u308c\u307e\u3059\uff0e\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u4e00\u884c\u5b9f\u884c\u3055\u308c\u308b\u305f\u3073\u306b “line” \u30a4\u30d9\u30f3\u30c8\u304c\u767a\u751f\u3057\u3066\u30c8\u30ec\u30fc\u30b9\u95a2\u6570\u304c\u547c\u3073\u51fa\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u304c\u5206\u304b\u308a\u307e\u3059\uff0e<\/p>\n\n\n\n wsgi_lineprof \u3067\u306f\u3088\u308a\u9ad8\u901f\u306b\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u3092\u884c\u3046\u305f\u3081\u306b\uff0c\u30c8\u30ec\u30fc\u30b9\u95a2\u6570\u3092 Cython \u3067\u5b9f\u88c5\u3057\u305f C \u62e1\u5f35\u30e2\u30b8\u30e5\u30fc\u30eb\u3068\u3057\uff0c wsgi_lineprof \u306e\u30c8\u30ec\u30fc\u30b9\u95a2\u6570\u3067\u306f\uff0c”line” \u30a4\u30d9\u30f3\u30c8\u304c\u767a\u751f\u3059\u308b\u305f\u3073\u306b\u305d\u306e\u884c\u756a\u53f7\u3068\u6642\u9593\u3092\u8a18\u9332\u3057\u307e\u3059\uff0e\u3053\u306e\u30a4\u30d9\u30f3\u30c8\u306f\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u305d\u306e\u884c\u304c\u5b9f\u884c\u3055\u308c\u308b\u524d\u306b\u767a\u751f\u3057\u307e\u3059\uff0e\u305d\u3057\u3066\u6b21\u306e line \u30a4\u30d9\u30f3\u30c8\u304c\u767a\u751f\u3057\u305f\u30bf\u30a4\u30df\u30f3\u30b0\u3067\uff0c\u524d\u306e\u30a4\u30d9\u30f3\u30c8\u767a\u751f\u6642\u306e\u6642\u9593\u3068\u306e\u5dee\u3092\u6c42\u3081\u3066\uff0c\u3042\u308b\u884c\u306e\u5b9f\u884c\u306b\u304b\u304b\u3063\u305f\u6642\u9593\u3092\u8a18\u9332\u3057\u3066\u3044\u307e\u3059\uff0e<\/p>\n\n\n\n \u5b9f\u88c5\u306e\u8a73\u7d30\u306f extensions\/extensions.pyx<\/a> \u3092\u53c2\u7167\u3057\u3066\u4e0b\u3055\u3044\uff0e<\/p>\n\n\n\n \u3053\u3053\u3067 Python \u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30b9\u30c6\u30c3\u30d7\u3092\u7d4c\u3066\u5b9f\u884c\u3055\u308c\u307e\u3059\uff0e<\/p>\n\n\n\n \u307e\u305f\uff0c \u307e\u305a\uff0cast \u30e2\u30b8\u30e5\u30fc\u30eb<\/a>\u3092\u4f7f\u3046\u3068\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u30d1\u30fc\u30b9\u3057\u305f\u7d50\u679c\u306e\u62bd\u8c61\u69cb\u6587\u6728\u3092\u898b\u308b\u3053\u3068\u304c\u51fa\u6765\u307e\u3059\uff0e\u4e0a\u306e\u4f8b\u3067\u5206\u304b\u308b\u3088\u3046\u306b \u6b21\u306b\uff0cdis \u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u4f7f\u3046\u3068\uff0c\u30d0\u30a4\u30c8\u30b3\u30fc\u30c9\u3092\u9006\u30a2\u30bb\u30f3\u30d6\u30eb\u3057\u305f\u7d50\u679c\u3092\u8868\u793a\u3059\u308b\u3053\u3068\u304c\u51fa\u6765\u307e\u3059\uff0e\u4e00\u756a\u5de6\u5074\u306e\u5217\u304c\u884c\u756a\u53f7\u3067\uff0c\u305d\u306e\u53f3\u5074\u306b\u5bfe\u5fdc\u3059\u308b\u30d0\u30a4\u30c8\u30b3\u30fc\u30c9\u304c\u8868\u793a\u3055\u308c\u307e\u3059\uff0e<\/p>\n\n\n\n CPython \u306e\u5185\u90e8\u5b9f\u88c5\u306b\u8208\u5473\u304c\u3042\u308b\u65b9\u306f\u300cPython Developer’s Guide – Design of CPython\u2019s Compiler<\/a>\u300d\u3092\u8aad\u3080\u3053\u3068\u3092\u304a\u3059\u3059\u3081\u3057\u307e\u3059\uff0e\u307e\u305f\uff0cCAMPHOR- Advent Calendar 2018 4\u65e5\u76ee\u306e\u8a18\u4e8b\u3068\u3057\u3066 @yu-i9 \u304c\u300cPython\u51e6\u7406\u7cfb\u5165\u9580 \u301c”1 + 1″ \u3067\u5b66\u3076\u51e6\u7406\u7cfb\u89e3\u8aad\u306e\u57fa\u790e\u301c<\/a>\u300d\u3068\u3044\u3046\u8a18\u4e8b\u3092\u66f8\u3044\u3066\u3044\u307e\u3059\uff0e\u3053\u3061\u3089\u3082 CPython \u306b\u3064\u3044\u3066\u89e3\u8aac\u3055\u308c\u3066\u3044\u308b\u306e\u3067\uff0c\u8208\u5473\u306e\u3042\u308b\u65b9\u306f\u305c\u3072\u8aad\u3093\u3067\u307f\u3066\u4e0b\u3055\u3044\uff0e<\/p>\n\n\n\n wsgi_lineprof \u306f\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u7d50\u679c\u306e\u51fa\u529b\u3092\u67d4\u8edf\u306b\u884c\u3048\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\uff0e\u3053\u306e\u7bc0\u3067\u306f\u7d50\u679c\u306e\u51fa\u529b\u306b\u5229\u7528\u3057\u3066\u3044\u308b\u6280\u8853\u3084\u5de5\u592b\u306b\u3064\u3044\u3066\u7d39\u4ecb\u3057\u307e\u3059\uff0e<\/p>\n\n\n\n \u7279\u5b9a\u306e\u30d5\u30a1\u30a4\u30eb\u3084\u95a2\u6570\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u7d50\u679c\u3060\u3051\u3092\u898b\u305f\u308a\uff0c\u5b9f\u884c\u6642\u9593\u304c\u9577\u304b\u3063\u305f\u95a2\u6570\u306e\u7d50\u679c\u306e\u307f\u3092\u898b\u305f\u308a\u3059\u308b\u3053\u3068\u3067\u3088\u308a\uff0c\u3088\u308a\u52b9\u7387\u7684\u306b\u7d50\u679c\u3092\u78ba\u8a8d\u3059\u308b\u3053\u3068\u304c\u51fa\u6765\u307e\u3059\uff0ewsgi_lineprof \u3067\u306f\u30d5\u30a3\u30eb\u30bf\u30fc\u306b\u3088\u3063\u3066\u3053\u308c\u3089\u3092\u5b9f\u73fe\u3057\u3066\u3044\u307e\u3059\uff0e\u30d5\u30a3\u30eb\u30bf\u30fc\u306f \u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u7d50\u679c\u306e\u51fa\u529b\u3067\u306f\u30d5\u30a1\u30a4\u30eb\u3068\u884c\u756a\u53f7\u306b\u5bfe\u5fdc\u3059\u308b\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u8868\u793a\u3057\u3066\u3044\u307e\u3059\uff0e\u52b9\u7387\u7684\u306b\u3053\u306e\u51e6\u7406\u3092\u884c\u3046\u305f\u3081\u306b\uff0c\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u306e linecache \u3068\u3044\u3046\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5229\u7528\u3057\u3066\u3044\u307e\u3059\uff0e\u3042\u307e\u308a\u4f7f\u7528\u3059\u308b\u6a5f\u4f1a\u306f\u591a\u304f\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u304c\uff0c\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306b\u884c\u5358\u4f4d\u3067\u30e9\u30f3\u30c0\u30e0\u30a2\u30af\u30bb\u30b9\u3059\u308b\u969b\u306b\u4fbf\u5229\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3059\uff0e<\/p>\n\n\n\n wsgi_lineprof \u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u306f stdout \u306b\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u7d50\u679c\u3092\u51fa\u529b\u3057\u307e\u3059\uff0estream \u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u30d5\u30a1\u30a4\u30eb\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u304c\u3067\u304d\uff0c\u7d50\u679c\u3092\u30d5\u30a1\u30a4\u30eb\u306b\u51fa\u529b\u3059\u308b\u3053\u3068\u3082\u51fa\u6765\u307e\u3059\uff0e\u6587\u5b57\u5217\u3092\u5f15\u6570\u306b\u3068\u308b write \u3068\u3044\u3046\u30e1\u30bd\u30c3\u30c9\u3092\u5b9f\u88c5\u3057\u3066\u3044\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u3042\u308c\u3070 \u4f55\u3067\u3082 stream \u3068\u3057\u3066\u6307\u5b9a\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u304a\u308a\uff0c\u69d8\u3005\u306a\u5834\u6240\u306b\u7d50\u679c\u3092\u51fa\u529b\u3059\u308b\u3053\u3068\u3092\u53ef\u80fd\u3068\u3057\u3066\u3044\u307e\u3059\uff0e<\/p>\n\n\n\n wsgi_lineprof \u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u306f\u540c\u671f\u7684\u306b\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u7d50\u679c\u3092\u51fa\u529b\u3057\u307e\u3059\u304c\uff0c \u3042\u308b\u30b7\u30f3\u30d7\u30eb Web \u30a2\u30d7\u30ea\u3067\u306e\u30d9\u30f3\u30c1\u30de\u30fc\u30af\u7d50\u679c\u3092\u4ee5\u4e0b\u306b\u793a\u3057\u307e\u3059\uff0e\u540c\u671f\u7684\u306b\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u7d50\u679c\u3092\u51fa\u529b\u3059\u308b\u3068\uff0c\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u3092\u4f7f\u308f\u306a\u3044\u3068\u304d\u306b\u6bd4\u3079\u3066\u6570ms\u306e\u30aa\u30fc\u30d0\u30fc\u30d8\u30c3\u30c9\u304c\u767a\u751f\u3057\u3066\u3044\u307e\u3059\u304c\uff0c\u975e\u540c\u671f\u7684\u306b\u66f8\u304d\u8fbc\u3080\u3068\u30aa\u30fc\u30d0\u30fc\u30d8\u30c3\u30c9\u304c\u6570\u767e\u03bcs\u7a0b\u5ea6\u3067\u6291\u3048\u3089\u308c\u3066\u3044\u308b\u3053\u3068\u304c\u5206\u304b\u308a\u307e\u3059\uff0e<\/p>\n\n\n\n \u5c11\u3057\u307e\u3068\u307e\u308a\u306e\u306a\u3044\u5f62\u306b\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u304c\uff0cwsgi_lineprof \u306e\u4ed5\u7d44\u307f\u306b\u3064\u3044\u3066\uff0cWSGI \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u30fb\u30e9\u30a4\u30f3\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u30fb\u7d50\u679c\u306e\u51fa\u529b\u3068\u3044\u30463\u3064\u306e\u30d1\u30fc\u30c8\u306b\u5206\u3051\u3066\u898b\u3066\u3044\u304d\u307e\u3057\u305f\uff0e\u305d\u308c\u305e\u308c\u306e\u90e8\u54c1\u306b\u7279\u306b\u65b0\u3057\u3044\u6280\u8853\u304c\u5229\u7528\u3055\u308c\u3066\u3044\u308b\u3068\u3044\u3046\u308f\u3051\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u304c\uff0c\u3053\u308c\u3089\u3092\u3046\u307e\u304f\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u4e00\u3064\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u3092\u958b\u767a\u3057\u3066\u3044\u307e\u3059\uff0e\u3053\u306e\u8a18\u4e8b\u304c\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u306e\u5b9f\u88c5\u3084\u305d\u306e\u95a2\u9023\u6280\u8853\u306b\u8208\u5473\u304c\u3042\u308b\u4eba\u304c\u5b9f\u88c5\u3092\u7406\u89e3\u3059\u308b\u305f\u3081\u306e\u4e00\u52a9\u306b\u306a\u308c\u3070\u5e78\u3044\u3067\u3059\uff0e<\/p>\n\n\n\nwsgi_lineprof \u3068\u306f<\/h2>\n\n\n\n
File: .\/examples\/fib.py\nName: fib\nTotal time: 0.01441 [sec]\n Line Hits Time Per Hit % Time Code\n====================================================\n 8 def fib(n):\n 9 21891 7153 0.3 49.6 if n <= 1:\n 10 10946 2857 0.3 19.8 return n\n 11 10945 4400 0.4 30.5 return fib(n - 1) + fib(n - 2)\n<\/code><\/pre>\n\n\n\n
wsgi_lineprof \u306e\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3<\/h2>\n\n\n\n
WSGI \u30df\u30c9\u30eb\u30a6\u30a7\u30a2<\/h2>\n\n\n\n
WSGI \u3068\u306f<\/h3>\n\n\n\n
def application(environ, start_response):\n start_response('200 OK', [('Content-type', 'text\/plain')])\n return [b'hello, world']<\/code><\/pre>\n\n\n\n
from wsgiref.simple_server import make_server\n\nserver = make_server('127.0.0.1', 8000, application)\nserver.serve_forever()<\/code><\/pre>\n\n\n\n
WSGI \u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3068\u306f<\/h3>\n\n\n\n
def middleware(app):\n def wrapped_application(environ, start_response):\n print(\"Before\")\n response = app(environ, start_response)\n print(\"After\")\n return response\n return wrapped_application\n\n# \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u3092\u9069\u7528\u3059\u308b\napplication = middleware(application)\n<\/code><\/pre>\n\n\n\n
wsgi_lineprof \u306e WSGI \u30df\u30c9\u30eb\u30a6\u30a7\u30a2<\/h3>\n\n\n\n
class LineProfilerMiddleware(object):\n # \u7701\u7565\n def __call__(self, env, start_response):\n # type: (WSGIEnvironment, StartResponse) -> Iterable[bytes]\n # \u7701\u7565\n self.profiler.enable() # \u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u3092\u958b\u59cb\n result = self.app(env, start_response)\n self.profiler.disable() # \u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u3092\u7d42\u4e86\n # \u7701\u7565<\/code><\/pre>\n\n\n\n
\u30e9\u30a4\u30f3\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9<\/h2>\n\n\n\n
\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u65b9\u6cd5\u306e\u6bd4\u8f03<\/h3>\n\n\n\n
sys.settrace<\/code> \u306e\u52d5\u4f5c\u3092\u898b\u3066\u307f\u307e\u3059\uff0e<\/p>\n\n\n\n
import sys\n\n\ndef fact(n):\n assert n >= 0\n r = 1\n for i in range(2, n + 1):\n r *= i\n return r\n\n\ndef trace(frame, event, arg):\n print(frame, event, arg)\n return trace\n\n\nsys.settrace(trace)\nprint(fact(3))<\/code><\/pre>\n\n\n\n
<frame at 0x7fe74b600818, file 'settrace.py', line 4, code fact> call None\n<frame at 0x7fe74b600818, file 'settrace.py', line 5, code fact> line None\n<frame at 0x7fe74b600818, file 'settrace.py', line 6, code fact> line None\n<frame at 0x7fe74b600818, file 'settrace.py', line 7, code fact> line None\n<frame at 0x7fe74b600818, file 'settrace.py', line 8, code fact> line None\n<frame at 0x7fe74b600818, file 'settrace.py', line 7, code fact> line None\n<frame at 0x7fe74b600818, file 'settrace.py', line 8, code fact> line None\n<frame at 0x7fe74b600818, file 'settrace.py', line 7, code fact> line None\n<frame at 0x7fe74b600818, file 'settrace.py', line 9, code fact> line None\n<frame at 0x7fe74b600818, file 'settrace.py', line 9, code fact> return 6\n6<\/code><\/pre>\n\n\n\n
wsgi_lineprof \u306e\u30e9\u30a4\u30f3\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9<\/h3>\n\n\n\n
PyEval_SetTrace<\/code> \u3068\u3044\u3046 C API \u3092\u5229\u7528\u3057\u3066\u30c8\u30ec\u30fc\u30b9\u95a2\u6570\u3092\u8a2d\u5b9a\u3057\u3066\u3044\u307e\u3059\uff0e
sys.settrace<\/code> \u306f
PyEval_SetTrace<\/code> \u306e\u30e9\u30c3\u30d1\u30fc\u3068\u306a\u3063\u3066\u3044\u308b\u305f\u3081\uff0c\u540c\u7b49\u306e\u6a5f\u80fd\u3092\u3088\u308a\u4f4e\u3044\u30aa\u30fc\u30d0\u30fc\u30d8\u30c3\u30c9\u3067\u5b9f\u884c\u3059\u308b\u3053\u3068\u304c\u671f\u5f85\u3067\u304d\u307e\u3059\uff0e<\/p>\n\n\n\n
Python \u306e\u5185\u90e8\u5b9f\u88c5<\/h3>\n\n\n\n
PyEval_SetTrace<\/code> \u306e\u4ed5\u7d44\u307f\u306b\u8208\u5473\u304c\u3042\u308b\u65b9\u306e\u305f\u3081\u306b\uff0cPython \u306e\u5185\u90e8\u5b9f\u88c5\u306b\u3064\u3044\u3066\u7c21\u5358\u306b\u7d39\u4ecb\u3057\u307e\u3059\uff0e<\/p>\n\n\n\n
PyEval_SetTrace<\/code> \u3067\u30c8\u30ec\u30fc\u30b9\u95a2\u6570\u3092\u767b\u9332\u3059\u308b\u3068\uff0c
PyThreadState<\/code> \u69cb\u9020\u4f53\u306e
c_tracefunc<\/code> \u3068\u3044\u3046\u30e1\u30f3\u30d0\u30fc\u306b\u95a2\u6570\u304c\u767b\u9332\u3055\u308c\u307e\u3059\uff0e(\u5bfe\u5fdc\u3059\u308b\u30b3\u30fc\u30c9<\/a>) \u3053\u306e
c_tracefunc<\/code> \u306f\u30d0\u30a4\u30c8\u30b3\u30fc\u30c9\u5b9f\u884c\u6642\u306b\u30d0\u30a4\u30c8\u30b3\u30fc\u30c9\u306e1\u547d\u4ee4\u3092\u5b9f\u884c\u3059\u308b\u305f\u3073\u306b\u547c\u3073\u51fa\u3055\u308c (\u5bfe\u5fdc\u3059\u308b\u30b3\u30fc\u30c9<\/a>)\uff0c\u884c\u306e\u5909\u308f\u308a\u76ee\u3067 “line” \u30a4\u30d9\u30f3\u30c8\u304c\u767a\u751f\u3059\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\uff0e(\u5bfe\u5fdc\u3059\u308b\u30b3\u30fc\u30c9<\/a>)<\/p>\n\n\n\n
PyEval_SetTrace<\/code> \u306f\u30d0\u30a4\u30c8\u30b3\u30fc\u30c9\u306e\u5b9f\u884c\u4e2d\u306b\u547c\u3073\u51fa\u3055\u308c\u308b\u95a2\u6570\u3067\u3059\u304c\uff0c\u884c\u756a\u53f7\u3092\u304d\u3061\u3093\u3068\u4fdd\u6301\u3067\u304d\u3066\u3044\u307e\u3059\uff0e\u3053\u308c\u306f\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u304b\u3089\u30d0\u30a4\u30c8\u30b3\u30fc\u30c9\u3078\u306e\u5909\u63db\u306b\u81f3\u308b\u307e\u3067\uff0c\u304d\u3061\u3093\u3068\u884c\u756a\u53f7\u3068 AST \u3084\u30d0\u30a4\u30c8\u30b3\u30fc\u30c9\u3068\u306e\u9593\u3067\u306e\u5bfe\u5fdc\u304c\u6b8b\u3055\u308c\u3066\u3044\u308b\u304b\u3089\u3067\u3059\uff0e\u5b9f\u969b\u306b\u3053\u306e\u5bfe\u5fdc\u304c\u4fdd\u6301\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u5909\u63db\u306e\u9014\u4e2d\u7d50\u679c\u3092\u898b\u308b\u3053\u3068\u3067\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3059\uff0e<\/p>\n\n\n\n
lineno<\/code> \u3084
col_offset<\/code> \u3068\u3044\u3063\u305f attribute \u306b\uff0cAST \u306e\u30ce\u30fc\u30c9\u304c\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u306e\u3069\u306e\u884c\u30fb\u5217\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u308b\u304b\u304c\u8a18\u9332\u3055\u308c\u3066\u3044\u307e\u3059\uff0e<\/p>\n\n\n\n
>>> program = \"\"\"a = 1 + 2\n... print(a)\n... \"\"\"\n>>> import ast\n>>> ast.dump(ast.parse(program), include_attributes=True)\n\"Module(body=[Assign(targets=[Name(id='a', ctx=Store(), lineno=1, col_offset=0)], value=BinOp(left=Num(n=1, lineno=1, col_offset=4), op=Add(), right=Num(n=2,\nlineno=1, col_offset=8), lineno=1, col_offset=4), lineno=1, col_offset=0), Expr(value=Call(func=Name(id='print', ctx=Load(), lineno=2, col_offset=0), args=[Name(id='a', ctx=Load(), lineno=2, col_offset=6)], keywords=[], lineno=2, col_offset=0), lineno=2, col_offset=0)])\"<\/code><\/pre>\n\n\n\n
>>> import dis\n>>> dis.dis(program)\n1 0 LOAD_CONST 0 (3)\n 2 STORE_NAME 0 (a)\n2 4 LOAD_NAME 1 (print)\n 6 LOAD_NAME 0 (a)\n 8 CALL_FUNCTION 1\n 10 POP_TOP\n 12 LOAD_CONST 1 (None)\n 14 RETURN_VALUE<\/code><\/pre>\n\n\n\n
\u7d50\u679c\u306e\u51fa\u529b<\/h2>\n\n\n\n
\u30d5\u30a3\u30eb\u30bf\u30fc<\/h3>\n\n\n\n
wsgi_lineprof.filters<\/code> \u3067\u63d0\u4f9b\u3055\u308c\u3066\u3044\u308b\u307b\u304b\uff0c
filter<\/code> \u3068\u3044\u3046\u540d\u524d\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u6301\u3064\u30af\u30e9\u30b9\u304b\uff0c\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u7d50\u679c\u3092\u3068\u3063\u3066\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u7d50\u679c\u3092\u8fd4\u3059 callable \u3092\u5b9a\u7fa9\u3059\u308b\u3053\u3068\u3067\u7c21\u5358\u306b\u4f5c\u308b\u3053\u3068\u304c\u51fa\u6765\u307e\u3059\uff0e<\/p>\n\n\n\n
filters = [\n # \u5b9f\u884c\u6642\u9593\u304c1\u79d2\u4ee5\u4e0a\u306e\u95a2\u6570\u306e\u307f\u3092\u7d50\u679c\u306b\u6b8b\u3059\u30d5\u30a3\u30eb\u30bf\u30fc\n lambda stats: filter(lambda s: s.total_time > 1.0, stats)\n]\napp = LineProfilerMiddleware(app, filters=filters) <\/code><\/pre>\n\n\n\n
linecache<\/h3>\n\n\n\n
>>> import linecache\n>>> lines = linecache.getlines(linecache.__file__)\n>>> lines[0]\n'\"\"\"Cache lines from Python source files.\\n'\n>>> lines[1]\n'\\n'\n>>> lines[8]\n'import sys\\n'<\/code><\/pre>\n\n\n\n
stream<\/h3>\n\n\n\n
sync\/async<\/h3>\n\n\n\n
async_stream<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6709\u52b9\u306b\u3059\u308b\u3068\uff0c\u5225\u30b9\u30ec\u30c3\u30c9\u3092\u4f7f\u3063\u3066\u7d50\u679c\u3092\u51fa\u529b\u3059\u308b\u3088\u3046\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff0e\u3053\u306e\u6a5f\u80fd\u306f @denzow \u6c0f\u306b\u3088\u3063\u3066\u63d0\u6848\u3055\u308c\u305f\u3082\u306e<\/a>\u3092\u5143\u306b\u3057\u3066\u3044\u307e\u3059\uff0e<\/p>\n\n\n\n
\u8a2d\u5b9a<\/th> \u5b9f\u884c\u6642\u9593<\/th><\/tr> \u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u306a\u3057<\/td> 78\u03bcs<\/td><\/tr> wsgi_lineprof (async)<\/td> 266\u03bcs<\/td><\/tr> wsgi_lineprof (sync)<\/td> 7950\u03bcs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n \u307e\u3068\u3081<\/h2>\n\n\n\n