摘要:與操作系統(tǒng)交互在系統(tǒng)中執(zhí)行將系統(tǒng)目錄更改為調(diào)試器在執(zhí)行完代碼,如果出現(xiàn)錯(cuò)誤,立即執(zhí)行命令后將會(huì)進(jìn)入調(diào)試器。性能分析用來測試各個(gè)部分或者函數(shù)的執(zhí)行時(shí)間,它會(huì)自動(dòng)多次執(zhí)行以產(chǎn)生一個(gè)非常精確的平均執(zhí)行時(shí)間。比的性能要快兩倍以上。
本文介紹如何使用ipython進(jìn)行快速的實(shí)驗(yàn)和調(diào)試,閑話免談,直接通過demo進(jìn)入主題。
與操作系統(tǒng)交互 !cmd在系統(tǒng)shell中執(zhí)行cmd
In [35]: !ls Gemfile Gemfile.lock README.md Rakefile bin config db log src%cd directory
將系統(tǒng)目錄更改為directory
In [36]: %cd - /private/tmp調(diào)試器 %debug
在執(zhí)行完代碼,如果出現(xiàn)錯(cuò)誤,立即執(zhí)行%debug命令后將會(huì)進(jìn)入調(diào)試器。在接觸%debug之前,筆者都是使用的是pdb.set_trace來調(diào)試程序,這樣的硬編碼非常之不方便。
In [45]: !touch a.py In [46]: !vim a.py In [47]: !cat a.py def divide(): assert(1 == 0) divide() In [56]: %run a.py --------------------------------------------------------------------------- AssertionError Traceback (most recent call last) /private/tmp/a.py in%run -d xxx.py() 2 assert(1 == 0) 3 ----> 4 divide() /private/tmp/a.py in divide() 1 def divide(): ----> 2 assert(1 == 0) 3 4 divide() AssertionError: In [57]: %debug > /private/tmp/a.py(2)divide() 1 def divide(): ----> 2 assert(1 == 0) 3 4 divide()
同樣立即進(jìn)入調(diào)試器。
性能分析 %timeit用來測試各個(gè)部分或者函數(shù)的執(zhí)行時(shí)間,它會(huì)自動(dòng)多次執(zhí)行以產(chǎn)生一個(gè)非常精確的平均執(zhí)行時(shí)間。
In [12]: strings = ["foo", "foobar", "baz","qux", "123 ffd"] * 100000
In [13]: %timeit method1 = [x for x in strings if x.startswith("foo")] 10 loops, best of 3: 93.4 ms per loop
In [14]: %timeit method2 = [x for x in strings if x[:3] == "foo"] 10 loops, best of 3: 36.4 ms per loop
method2 比 method1 的性能要快兩倍以上。
%run -ppython的主要性能分析工具是cProfile模塊,它會(huì)記錄各個(gè)函數(shù)的耗費(fèi)時(shí)間,在命令行中,可以通過如下命令來進(jìn)行性能分析:
python -m cProfile xxx.py
而在ipython中,會(huì)使用下面的命令來運(yùn)行一個(gè)文件
%run -p -s cumulative xxx.py%prun
如果想要運(yùn)行一個(gè)函數(shù)或語句,請使用如下命令:
%prun -l 7 -s cumulative run()
待測函數(shù):
In [17]: from numpy.random import randn In [18]: x = randn(3000, 3000) In [19]: y = randn(3000, 3000) In [20]: def add_and_sum(x,y): ...: added = x + y ...: summed = added.sum(axis=1) ...: return summed ...:
使用prun的結(jié)果如下:
In [21]: %prun add_and_sum(x, y) 6 function calls in 0.340 seconds Ordered by: internal time ncalls tottime percall cumtime percall filename:lineno(function) 1 0.310 0.310 0.335 0.335:1(add_and_sum) 1 0.025 0.025 0.025 0.025 {method "reduce" of "numpy.ufunc" objects} 1 0.005 0.005 0.340 0.340 :1( ) 1 0.000 0.000 0.025 0.025 {method "sum" of "numpy.ndarray" objects} 1 0.000 0.000 0.025 0.025 _methods.py:31(_sum) 1 0.000 0.000 0.000 0.000 {method "disable" of "_lsprof.Profiler" objects}
上面的結(jié)果不是很好理解,筆者更喜歡用line_profiler庫來分析。
%lprun使用一個(gè)庫line_profiler,這個(gè)庫的輸出結(jié)果簡單易理解。
這個(gè)庫不是內(nèi)建的,需要手動(dòng)安裝,安裝命令:
pip install line_profiler
然后在ipython中手動(dòng)load lprun:
In [2]: %load_ext line_profiler In [3]: %lprun Timer unit: 1e-06 s
待測函數(shù):
In [17]: from numpy.random import randn In [18]: x = randn(3000, 3000) In [19]: y = randn(3000, 3000) In [20]: def add_and_sum(x,y): ...: added = x + y ...: summed = added.sum(axis=1) ...: return summed ...: In [21]: def call_function(): ...: x = randn(1000, 1000) ...: y = randn(1000, 1000) ...: return add_and_sum(x, y)
使用lprun后的結(jié)果如下:
In [23]: %lprun -f add_and_sum -f call_function call_function() Timer unit: 1e-06 s Total time: 0.004438 s File:Function: add_and_sum at line 1 Line # Hits Time Per Hit % Time Line Contents ============================================================== 1 def add_and_sum(x,y): 2 1 3929 3929.0 88.5 added = x + y 3 1 508 508.0 11.4 summed = added.sum(axis=1) 4 1 1 1.0 0.0 return summed Total time: 0.062512 s File: Function: call_function at line 1 Line # Hits Time Per Hit % Time Line Contents ============================================================== 1 def call_function(): 2 1 29193 29193.0 46.7 x = randn(1000, 1000) 3 1 28449 28449.0 45.5 y = randn(1000, 1000) 4 1 4870 4870.0 7.8 return add_and_sum(x, y)
通常,會(huì)使用%prun(cProfile)做“宏觀”性能分析,而用%lprun(line_profiler)做“微觀”性能分析。使用line_profiler必須要指定待測的函數(shù),是因?yàn)檫@個(gè)庫要跟蹤每一行代碼的執(zhí)行時(shí)間。
基本名令 內(nèi)省在一個(gè)變量的前面或后面加上問號?,可以顯示該變量的基本信息
In [23]: a=1 In [24]: a? Type: int String form: 1 Docstring: int(x=0) -> int or long int(x, base=10) -> int or long >>> int("0b100", base=0) 4
如果這個(gè)變量是函數(shù)的話,一個(gè)問號?來顯示docstring,兩個(gè)問號來顯示該函數(shù)的源碼
%timeit檢測python語句的執(zhí)行時(shí)間
In [16]: %timeit sum(i*i for i in xrange(1000)) 10000 loops, best of 3: 68.6 μs per loop%logstart
執(zhí)行這個(gè)命令,開始記錄控制臺(tái)會(huì)話,這樣可以將整個(gè)過程保存起來
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/38561.html
摘要:然而,每個(gè)人對編輯器的喜好各不相同,甚至引發(fā)出諸如神的編輯器與編輯器之神這種信仰之爭。我們用來寫的工具有兩類一種是被稱為的集成開發(fā)環(huán)境,它們?yōu)殚_發(fā)而生。但僅我上述提及的幾個(gè)其實(shí)也足夠用了。正如標(biāo)題所說工欲善其事,必先利其器。 通常來說,每個(gè)程序員都有自己趁手的兵器: 代碼編輯器 。你要是讓他換個(gè)開發(fā)環(huán)境,恐怕開發(fā)效率至少下降三成。然而,每個(gè)人對編輯器的喜好各不相同,甚至引發(fā)出諸如神的編...
摘要:對于有著完全的支持是一個(gè)交互式的開發(fā)環(huán)境,是的下一代產(chǎn)品,集成了更多的功能,等其正式版發(fā)布,相信那時(shí)就是被取代的時(shí)候通過使用,能夠以靈活,集成和可擴(kuò)展的方式處理文檔和活動(dòng)可以開啟終端,用于交互式運(yùn)行代碼,完全支持豐富的輸出支持,,,等任何文 showImg(https://segmentfault.com/img/remote/1460000018602436?w=1282&h=721...
摘要:第步啟用與以太坊區(qū)塊鏈交互從獲得后。我希望本教程介紹了通過在操作系統(tǒng)中設(shè)置托管以太坊節(jié)點(diǎn)的基本步驟。這里是原文和中設(shè)置以太坊托管節(jié)點(diǎn) 如果你想與以太坊區(qū)塊鏈進(jìn)行交互以獲取最新區(qū)塊的詳細(xì)信息,可以使用以太網(wǎng)節(jié)點(diǎn)、本地節(jié)點(diǎn)或托管節(jié)點(diǎn)連接到以太坊區(qū)塊鏈的交易信息或發(fā)送交易。由于有許多第三方插件和應(yīng)用程序可用于執(zhí)行此操作,你可能會(huì)認(rèn)為我們?yōu)槭裁葱枰粋€(gè)節(jié)點(diǎn)。如果要部署智能合約或使用腳本自動(dòng)與智...
摘要:第步啟用與以太坊區(qū)塊鏈交互從獲得后。我希望本教程介紹了通過在操作系統(tǒng)中設(shè)置托管以太坊節(jié)點(diǎn)的基本步驟。這里是原文和中設(shè)置以太坊托管節(jié)點(diǎn) 如果你想與以太坊區(qū)塊鏈進(jìn)行交互以獲取最新區(qū)塊的詳細(xì)信息,可以使用以太網(wǎng)節(jié)點(diǎn)、本地節(jié)點(diǎn)或托管節(jié)點(diǎn)連接到以太坊區(qū)塊鏈的交易信息或發(fā)送交易。由于有許多第三方插件和應(yīng)用程序可用于執(zhí)行此操作,你可能會(huì)認(rèn)為我們?yōu)槭裁葱枰粋€(gè)節(jié)點(diǎn)。如果要部署智能合約或使用腳本自動(dòng)與智...
閱讀 3066·2023-04-26 00:23
閱讀 3480·2021-09-13 10:28
閱讀 2260·2021-08-31 14:18
閱讀 2970·2019-08-30 15:54
閱讀 2015·2019-08-30 15:43
閱讀 1383·2019-08-29 16:56
閱讀 2869·2019-08-29 14:16
閱讀 2128·2019-08-28 17:51