亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

交互式的開發(fā)環(huán)境 - ipython

Hydrogen / 3445人閱讀

摘要:與操作系統(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 ()
      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()
%run -d xxx.py

同樣立即進(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 -p

python的主要性能分析工具是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

相關(guān)文章

  • 工欲善其事必先利其器:用什么寫Python?

    摘要:然而,每個(gè)人對編輯器的喜好各不相同,甚至引發(fā)出諸如神的編輯器與編輯器之神這種信仰之爭。我們用來寫的工具有兩類一種是被稱為的集成開發(fā)環(huán)境,它們?yōu)殚_發(fā)而生。但僅我上述提及的幾個(gè)其實(shí)也足夠用了。正如標(biāo)題所說工欲善其事,必先利其器。 通常來說,每個(gè)程序員都有自己趁手的兵器: 代碼編輯器 。你要是讓他換個(gè)開發(fā)環(huán)境,恐怕開發(fā)效率至少下降三成。然而,每個(gè)人對編輯器的喜好各不相同,甚至引發(fā)出諸如神的編...

    Brenner 評論0 收藏0
  • JupyterLab:程序員筆記本神器

    摘要:對于有著完全的支持是一個(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...

    rubyshen 評論0 收藏0
  • 如何利用Python庫Web3.py和Infura在Windows中設(shè)置托管以太坊節(jié)點(diǎn)

    摘要:第步啟用與以太坊區(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)與智...

    jaysun 評論0 收藏0
  • 如何利用Python庫Web3.py和Infura在Windows中設(shè)置托管以太坊節(jié)點(diǎn)

    摘要:第步啟用與以太坊區(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)與智...

    AlphaGooo 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<