国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python在生物信息學(xué)中的應(yīng)用:讓你的程序運(yùn)行得更快

這篇具有很好參考價值的文章主要介紹了Python在生物信息學(xué)中的應(yīng)用:讓你的程序運(yùn)行得更快。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

程序運(yùn)行太慢,想要提速,但不使用復(fù)雜的技術(shù)如 C 擴(kuò)展或 JIT 編譯器。

解決方案

程序優(yōu)化的第一準(zhǔn)則是“不要優(yōu)化”,第二準(zhǔn)則是“不要優(yōu)化那些不重要的部分”?;谶@兩個原則,如果你的程序運(yùn)行得很慢,你得先找出影響性能的問題所在。

多數(shù)時候我們發(fā)現(xiàn)程序把大量的時間花在幾個熱點(diǎn)位置,比如處理數(shù)據(jù)的內(nèi)層循環(huán)。一旦確認(rèn)了這些熱點(diǎn),就可以使用以下各小節(jié)中介紹的技術(shù)讓程序運(yùn)行得更快。

使用函數(shù)

很多人開始使用 Python 時都是用它來編寫一些簡單的腳本。最開始時,很容易陷入只管編寫代碼而不重視程序結(jié)構(gòu)的怪圈。例如:

# somescript.py


import sys
import csv


with open(sys.argv[1]) as f:
    for row in csv.reader(f):


    # Some kind of processing
    pass

一個鮮為人知的事實(shí)是,像上面這樣定義在全局范圍內(nèi)的代碼比定義在函數(shù)中的代碼要慢。速度的差異與局部變量與全局變量的實(shí)現(xiàn)機(jī)制有關(guān)(涉及局部變量的操作要更快)。因此,如果想讓程序運(yùn)行得更快,可以將腳本中的語句放入函數(shù)中即可:

# somescript.py
import sys
import csv


def main(filename):
    with open(filename) as f:
        for row in csv.reader(f):
        # Some kind of processing
            pass


main(sys.argv[1])

運(yùn)行速度的差異與具體執(zhí)行的任務(wù)有關(guān),但根據(jù)經(jīng)驗(yàn),提升 15% ~ 30% 的情況很常見。

消除屬性訪問

每次使用句點(diǎn)操作符(.)來訪問對象的屬性都會帶來開銷。在底層,這會觸發(fā)調(diào)用特殊的方法。

通??梢杂?from module import name 的導(dǎo)入形式以及選擇性地使用綁定方法(bound method)來避免出現(xiàn)屬性查詢操作。我們用下面的代碼片段來加以說明:

import math


def compute_roots(nums):
    result?=?[]
????for?n?in?nums:
????    result.append(math.sqrt(n))
    return result


# Test
nums = range(1000000)
for n in range(100):
    r = compute_roots(nums)

當(dāng)在我們的機(jī)器上測試時,這個程序運(yùn)行了大約 40 秒?,F(xiàn)在將 compute_roots() 函數(shù)修改為如下形式:

from math import sqrt


def?compute_roots(nums):
    result = []
    result_append = result.append
    for n in nums:
????    result_append(sqrt(n))
    return result

修改后的版本運(yùn)行時間大約是 29 秒。唯一不同之處就是消除了屬性訪問。用 sqrt() 代替了 math.sqrt()。result.append() 方法被賦給一個局部變量 result_append,然后在內(nèi)部循環(huán)中使用它。

但是,必須強(qiáng)調(diào)的是,只有在頻繁執(zhí)行的代碼中做這些修改才有意義,比如在循環(huán)中。因此,這種優(yōu)化技術(shù)適用的場景需要經(jīng)過精心挑選。

理解變量所處的位置

前述提及,訪問局部變量比全局變量要快。對于需要頻繁訪問的名稱,想提高運(yùn)行速度,可以通過盡量讓這些變量盡可能成為局部變量來實(shí)現(xiàn)。例如:

import math


def compute_roots(nums):
    sqrt = math.sqrt
    result = []
    result_append = result.append
    for n in nums:
        result_append(sqrt(n))
    return result

在這個版本中,sqrt 方法已經(jīng)從 math 模塊中提取出來并放置在一個局部變量中。如果運(yùn)行這份代碼,執(zhí)行時間大約是 25 秒,這比上一個版本的 29 秒又有所提升。根本原因就是查找局部變量比全局變量要快。

當(dāng)使用類時,局部參數(shù)同樣能起到提速的效果。一般來說,查找像 self.name 這樣的值會比訪問一個局部變量要慢很多。在內(nèi)層循環(huán)中將需要經(jīng)常訪問的屬性移到局部變量中來會很劃算。例如:

# Slower
class?SomeClass:
????...
    def method(self):
        for x in s:
            op(self.value)


# Faster
class?SomeClass:
    ...
    def method(self):
        value = self.value
    for x in s:
        op(value)

避免不必要的抽象

裝飾器(decorator)、屬性(property)或者描述符(descriptor)包裝過的代碼,運(yùn)行速度通常會變慢。參考以下代碼:

class A:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    @property
    def y(self):
        return self._y
    @y.setter
    def y(self, value):
        self._y = value

測試一下:

>>> from timeit import timeit
>>> a = A(1,2)
>>> timeit('a.x', 'from __main__ import a')
0.07817923510447145
>>> timeit('a.y', 'from __main__ import a')
0.35766440676525235
>>>

使用內(nèi)建的容器

內(nèi)建的數(shù)據(jù)類型比如字符串、元組、列表、集合以及字典都是用 C 語言實(shí)現(xiàn)的,速度非???。如果需要構(gòu)建自己的數(shù)據(jù)結(jié)構(gòu)作為替代(例如鏈表、二叉樹等),想在性能上達(dá)到內(nèi)建的速度幾乎不可能,因此還是盡量使用內(nèi)建的數(shù)據(jù)結(jié)構(gòu)吧。

避免產(chǎn)生不必要的數(shù)據(jù)結(jié)構(gòu)或者拷貝動作

有時候程序員可能會創(chuàng)建一些不必要的數(shù)據(jù)結(jié)構(gòu),比如下面的代碼:

values = [x for x in sequence]
squares = [x*x for x in values]

也許這里的想法是首先將一些值收集到一個列表中,然后使用列表推導(dǎo)來執(zhí)行操作。不過,第一個列表完全沒有必要,可以簡單的像下面這樣寫:

squares?=?[x*x?for?x?in?sequence]

與此相關(guān),還要注意下那些對Python的共享數(shù)據(jù)機(jī)制過于偏執(zhí)的程序所寫的代碼。有些人并沒有很好的理解或信任Python的內(nèi)存模型,濫用 copy.deepcopy()?之類的函數(shù)。通常在這些代碼中是可以去掉復(fù)制操作的。

討論

在進(jìn)行優(yōu)化之前,有必要研究一下使用的算法。選擇一個復(fù)雜度為 O(n log n) 的算法要比你去調(diào)整一個復(fù)雜度為 O(n**2) 的算法所帶來的性能提升要大得多。

如果優(yōu)化代碼勢在必行,那么請從整體考慮。作為一般準(zhǔn)則,不要對程序的每一個部分都去優(yōu)化,因?yàn)檫@些修改會導(dǎo)致代碼難以閱讀和理解。你應(yīng)該專注于優(yōu)化產(chǎn)生性能瓶頸的地方,比如內(nèi)部循環(huán)。

還要注意一些小的優(yōu)化的結(jié)果。比如下面創(chuàng)建字典的兩種方式:

a = {
    'name' : 'AAPL',
    'shares' : 100,
    'price' : 534.22
}


b = dict(name='AAPL', shares=100, price=534.22)

后面一種寫法更簡潔一些(你不需要在關(guān)鍵字上輸入引號)。不過,如果你將這兩個代碼片段進(jìn)行性能測試對比時,會發(fā)現(xiàn)使用 dict()?的方式會慢了3倍??吹竭@個,你是不是有沖動把所有使用 dict()?的代碼都替換成第一種。不過,聰明的程序員只會關(guān)注他應(yīng)該關(guān)注的地方,比如內(nèi)部循環(huán)。在其他地方,這點(diǎn)性能損失沒有什么影響。

如果你的優(yōu)化要求比較高,本節(jié)的這些簡單技術(shù)滿足不了,那么你可以研究下基于即時編譯(JIT)技術(shù)的一些工具。例如,PyPy 工程是 Python 解釋器的另外一種實(shí)現(xiàn),它會分析你的程序運(yùn)行并對那些頻繁執(zhí)行的部分生成本機(jī)機(jī)器碼。它有時候能極大的提升性能,通??梢越咏?C 代碼的速度。不過可惜的是,到寫這本書為止,PyPy 還不能完全支持 Python3。因此,這個是你將來需要去研究的。你還可以考慮下 Numba 工程, Numba 是一個在你使用裝飾器來選擇 Python 函數(shù)進(jìn)行優(yōu)化時的動態(tài)編譯器。這些函數(shù)會使用LLVM被編譯成本地機(jī)器碼。它同樣可以極大的提升性能。但是,跟 PyPy 一樣,它對于 Python 3 的支持現(xiàn)在還停留在實(shí)驗(yàn)階段。

最后我引用John Ousterhout說過的話作為結(jié)尾:“最好的性能提升就是從不工作轉(zhuǎn)變?yōu)榭梢怨ぷ?/strong>”。直到你真的需要優(yōu)化的時候再去考慮它。確保你程序正確的運(yùn)行通常比讓它運(yùn)行更快要更重要一些(至少開始是這樣的)。

參考

  • 《Python Cookbook》第三版

  • http://python3-cookbook.readthedocs.org/zh_CN/latest/

關(guān)于簡說基因

  • 生信平臺

    Galaxy中國(UseGalaxy.cn)致力于打造中國人的云上生物信息基礎(chǔ)設(shè)施。大量在線工具免費(fèi)使用。無需安裝,用完即走。活躍的用戶社區(qū),隨時交流使用心得。文章來源地址http://www.zghlxwxcb.cn/news/detail-830378.html

  • 生信培訓(xùn)

    簡說基因的生信培訓(xùn)班,榮獲學(xué)員的一致好評。如果你也對生物信息學(xué)感興趣,歡迎來跟簡說基因,學(xué)真生信。

  • 生信分析

    我們能夠承接所有 NGS 組學(xué)數(shù)據(jù)分析業(yè)務(wù),包括但不限于 WGS / WES / RNA-seq 等?;蚪M組裝、注釋,以及各種重測序業(yè)務(wù)都可以與簡說基因合作。

到了這里,關(guān)于Python在生物信息學(xué)中的應(yīng)用:讓你的程序運(yùn)行得更快的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 輕松搞定Spring集成緩存,讓你的應(yīng)用程序飛起來!

    輕松搞定Spring集成緩存,讓你的應(yīng)用程序飛起來!

    主頁傳送門:?? 傳送 ??Spring 提供了對緩存的支持,允許你將數(shù)據(jù)存儲在緩存中以提高應(yīng)用程序的性能。Spring 緩存抽象基于 Java Caching API,但提供了更簡單的編程模型和更高級的功能。 ??Spring 集成緩存提供了一種方便的方式來使用緩存,從而提高應(yīng)用程序的性能。Spr

    2024年02月07日
    瀏覽(24)
  • 【超詳細(xì)】深入探究Java中的線程安全,讓你的程序更加可靠~

    我們將從以下四個問題入手,對Java的多線程問題抽絲剝繭。 什么是線程安全? 如何實(shí)現(xiàn)線程安全? 不同的線程安全實(shí)現(xiàn)方法有什么區(qū)別? 如何實(shí)現(xiàn)HashMap線程安全? 1. 什么是線程安全? 線程安全指的是多個線程并發(fā)訪問共享資源時,不會出現(xiàn)數(shù)據(jù)不一致或其他意外情況的

    2023年04月24日
    瀏覽(25)
  • 讓你的代碼動起來:Python進(jìn)度條神器tqdm詳解及應(yīng)用實(shí)例

    各位Python高手,今天我要給大家介紹一個好用的庫,它就是: tqdm tqdm在阿拉伯語中的意思是 \\\"進(jìn)展\\\",所以這個庫也被稱為 \\\"快速進(jìn)展條\\\"。不得不說,這個名字真的很有創(chuàng)意! 讓我們想象一下,你正在運(yùn)行一個耗時的數(shù)據(jù)處理任務(wù)或者訓(xùn)練一個復(fù)雜的深度學(xué)習(xí)模型。你坐在那

    2024年02月07日
    瀏覽(31)
  • 實(shí)戰(zhàn)演示:使用Python編寫人臉識別測試代碼,讓你的應(yīng)用擁有智能感知能力

    人臉識別是計算機(jī)視覺領(lǐng)域的一個重要應(yīng)用。它使用計算機(jī)算法來識別和驗(yàn)證面部特征,通常用于安全認(rèn)證、視頻監(jiān)控、人臉比對等方面。近年來,隨著深度學(xué)習(xí)技術(shù)的發(fā)展,人臉識別的性能得到了極大的提升,成為了智能感知應(yīng)用中的重要一環(huán)。在這篇文章中,我們將使用

    2024年02月12日
    瀏覽(22)
  • 圖形學(xué)中的抗鋸齒討論以及在unity中的應(yīng)用

    圖形學(xué)中的抗鋸齒討論以及在unity中的應(yīng)用

    抗鋸齒(Anti-Aliasing)是圖形學(xué)中,很重要的一個部分。本文旨在做一些分析總結(jié),并對平時不理解的細(xì)節(jié),做了調(diào)研,但畢竟不是做GPU行家,所以有不對的地方,歡迎拍磚^^。 下圖,是一個在unity中,不開啟抗鋸齒的情況下的渲染效果,可以看到,邊沿區(qū)域,例如黃色塊的邊沿

    2024年02月15日
    瀏覽(18)
  • 線性代數(shù)在計算機(jī)圖形學(xué)中的應(yīng)用

    線性代數(shù)在計算機(jī)圖形學(xué)中的應(yīng)用

    文章背景:本學(xué)期我學(xué)習(xí)了計算機(jī)圖形學(xué),我發(fā)現(xiàn)背后都是由線性代數(shù)的知識作為支撐的,于是我想把目前我了解到的一些數(shù)學(xué)知識總結(jié)出來。另外,本文在舉例時主要采用計算機(jī)游戲的場景來進(jìn)行舉例,以更好地說明這些數(shù)學(xué)概念或公式的應(yīng)用。 (本文章為課程作業(yè)) ?

    2024年02月04日
    瀏覽(32)
  • 【計算機(jī)圖形學(xué)】 線性代數(shù)在圖形學(xué)中的應(yīng)用

    【計算機(jī)圖形學(xué)】 線性代數(shù)在圖形學(xué)中的應(yīng)用

    ???♂? 作者:海碼007 ?? 專欄:計算機(jī)圖形學(xué)專欄 ?? 標(biāo)題:【計算機(jī)圖形學(xué)】 線性代數(shù)在圖形學(xué)中的應(yīng)用 ?? 寄語:對知識永遠(yuǎn)有興趣! ?? 最后: 文章作者技術(shù)和水平有限,如果文中出現(xiàn)錯誤,希望大家能指正 為什么要總結(jié)一下線性代數(shù)?因?yàn)橛嬎銠C(jī)圖形學(xué)中有很

    2024年03月10日
    瀏覽(21)
  • 第四篇【傳奇開心果系列】Python的自動化辦公庫技術(shù)點(diǎn)案例示例:深度解讀Pandas生物信息學(xué)領(lǐng)域應(yīng)用

    第四篇【傳奇開心果系列】Python的自動化辦公庫技術(shù)點(diǎn)案例示例:深度解讀Pandas生物信息學(xué)領(lǐng)域應(yīng)用

    生物信息學(xué)是一門將計算機(jī)科學(xué)和生物學(xué)相結(jié)合的跨學(xué)科領(lǐng)域,旨在利用計算機(jī)技術(shù)和統(tǒng)計學(xué)方法來處理、分析和解釋生物學(xué)數(shù)據(jù)。在生物信息學(xué)研究中,研究人員處理的數(shù)據(jù)種類繁多,包括基因組數(shù)據(jù)、蛋白質(zhì)數(shù)據(jù)、生物醫(yī)學(xué)圖像數(shù)據(jù)等。 Pandas 是一個基于 Python 編程語言的

    2024年03月09日
    瀏覽(29)
  • 信息系統(tǒng)安全審計,這種系統(tǒng)讓你的電腦徹底安全?。? decoding=

    信息系統(tǒng)安全審計,這種系統(tǒng)讓你的電腦徹底安全!!

    信息系統(tǒng)安全性審計的主要目標(biāo)是審查企業(yè)信息系統(tǒng)和電子數(shù)據(jù)的安全性、可靠性、可用性、保密性等。 一是預(yù)防來自互聯(lián)網(wǎng)對信息系統(tǒng)的威脅,二是預(yù)防來自企業(yè)內(nèi)部對信息系統(tǒng)的危害。 ——百度百科 信息系統(tǒng)安全涉及多個層面和維度,確保數(shù)據(jù)的機(jī)密性、完整性和可用

    2024年04月10日
    瀏覽(25)
  • 這種新的Facebook Messenger群發(fā)方式,讓你的信息更有價值!

    這種新的Facebook Messenger群發(fā)方式,讓你的信息更有價值!

    隨著社交媒體的迅速發(fā)展,F(xiàn)acebook已成為人們分享信息、建立聯(lián)系和開展業(yè)務(wù)的重要平臺之一。在這個數(shù)字時代,如何有效地傳達(dá)信息并與目標(biāo)受眾建立聯(lián)系成為了關(guān)鍵的挑戰(zhàn)。 而最近引入的Facebook Messenger群發(fā)方式為我們提供了一種全新的機(jī)會,讓我們的信息更有價值,更有

    2024年02月06日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包