女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用cython編寫程序能夠得到更高的性能

馬哥Linux運(yùn)維 ? 2018-01-16 16:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我最喜歡的是Python,它的代碼優(yōu)雅而實(shí)用,可惜純粹從速度上來(lái)看它比大多數(shù)語(yǔ)言都要慢。大多數(shù)人也認(rèn)為的速度和易于使用是兩極對(duì)立的——編寫C代碼的確非常痛苦。而 Cython 試圖消除這種兩重性,并讓你同時(shí)擁有 Python 的語(yǔ)法和 C 數(shù)據(jù)類型和函數(shù)——它們兩個(gè)都是世界上最好的。請(qǐng)記住,我絕不是我在這方面的專家,這是我的第一次Cython真實(shí)體驗(yàn)的筆記:

編輯:根據(jù)一些我收到的反饋,大家似乎有點(diǎn)混淆——Cython是用來(lái)生成 C 擴(kuò)展到而不是獨(dú)立的程序的。所有的加速都是針對(duì)一個(gè)已經(jīng)存在的 Python 應(yīng)用的一個(gè)函數(shù)進(jìn)行的。沒(méi)有使用C 或 Lisp 重寫整個(gè)應(yīng)用程序,也沒(méi)有手寫C擴(kuò)展 。只是用一個(gè)簡(jiǎn)單的方法來(lái)整合C的速度和C數(shù)據(jù)類型到 Python 函數(shù)中去。
用cython編寫程序能夠得到更高的性能

現(xiàn)在可以說(shuō),我們能使下文的great_circle 函數(shù)更快。所謂great_circle 是計(jì)算沿地球表面兩點(diǎn)之間的距離的問(wèn)題:

import math

def great_circle(lon1,lat1,lon2,lat2):

radius=3956#miles

x=math.pi/180.0

a=(90.0-lat1)*(x)

b=(90.0-lat2)*(x)

theta=(lon2-lon1)*(x)

c=math.acos((math.cos(a)*math.cos(b))+

(math.sin(a)*math.sin(b)*math.cos(theta)))

returnradius*c

讓我們調(diào)用它 50 萬(wàn)次并測(cè)定它的時(shí)間 :

import timeit

lon1,lat1,lon2,lat2= -72.345,34.323,-61.823,54.826

num=500000

t=timeit.Timer("p1.great_circle(%f,%f,%f,%f)"%(lon1,lat1,lon2,lat2),

"import p1")

print"Pure python function",t.timeit(num),"sec"

約2.2秒 。它太慢了!

讓我們?cè)囍焖俚赜肅ython改寫它,然后看看是否有差別:

import math

def great_circle(floatlon1,floatlat1,floatlon2,floatlat2):

cdeffloatradius=3956.0

cdeffloatpi=3.14159265

cdeffloatx=pi/180.0

cdeffloata,b,theta,c

a=(90.0-lat1)*(x)

b=(90.0-lat2)*(x)

theta=(lon2-lon1)*(x)

c=math.acos((math.cos(a)*math.cos(b))+(math.sin(a)*math.sin(b)*math.cos(theta)))

returnradius*c

請(qǐng)注意,我們?nèi)匀籭mportmath——cython讓您在一定程度上混搭Python和C數(shù)據(jù)類型在。轉(zhuǎn)換是自動(dòng)的,但并非沒(méi)有代價(jià)。在這個(gè)例子中我們所做的就是定義一個(gè)Python函數(shù),聲明它的輸入?yún)?shù)是浮點(diǎn)數(shù)類型,并為所有變量聲明類型為C浮點(diǎn)數(shù)據(jù)類型。計(jì)算部分它仍然使用了Python的 math 模塊。

現(xiàn)在我們需要將其轉(zhuǎn)換為C代碼再編譯為Python擴(kuò)展。完成這一部的最好的辦法是編寫一個(gè)名為setup.py發(fā)布腳本。但是,現(xiàn)在我們用手工方式 ,以了解其中的巫術(shù):

# this will create a c1.c file - the C source code to build a python extension

cythonc1.pyx

# Compile the object file

gcc-c-fPIC-I/usr/include/python2.5/c1.c

# Link it into a shared library

gcc-sharedc1.o-oc1.so

現(xiàn)在你應(yīng)該有一個(gè)c1.so(或.dll)文件,它可以被Python import。現(xiàn)在運(yùn)行一下:

t=timeit.Timer("c1.great_circle(%f,%f,%f,%f)"%(lon1,lat1,lon2,lat2),

"import c1")

print"Cython function (still using python math)",t.timeit(num),"sec"

約1.8秒 。并沒(méi)有我們一開始期望的那種大大的性能提升。使用 python 的 math 模塊應(yīng)該是瓶頸。現(xiàn)在讓我們使用C標(biāo)準(zhǔn)庫(kù)替代之:

cdef externfrom"math.h":

floatcosf(floattheta)

floatsinf(floattheta)

floatacosf(floattheta)

def great_circle(floatlon1,floatlat1,floatlon2,floatlat2):

cdeffloatradius=3956.0

cdeffloatpi=3.14159265

cdeffloatx=pi/180.0

cdeffloata,b,theta,c

a=(90.0-lat1)*(x)

b=(90.0-lat2)*(x)

theta=(lon2-lon1)*(x)

c=acosf((cosf(a)*cosf(b))+(sinf(a)*sinf(b)*cosf(theta)))

returnradius*c

與 import math 相應(yīng),我們使用cdef extern 的方式使用從指定頭文件聲明函數(shù)(在此就是使用C標(biāo)準(zhǔn)庫(kù)的math.h)。我們替代了代價(jià)高昂的的Python函數(shù),然后建立新的共享庫(kù),并重新測(cè)試

t=timeit.Timer("c2.great_circle(%f,%f,%f,%f)"%(lon1,lat1,lon2,lat2),

"import c2")

print"Cython function (using trig function from math.h)",t.timeit(num),"sec"

現(xiàn)在有點(diǎn)喜歡它了吧?0.4秒 –比純Python函數(shù)有5倍的速度增長(zhǎng)。我們還有什么方法可以再提高速度?c2.great_circle()仍是一個(gè)Python函數(shù)調(diào)用,這意味著它產(chǎn)生Python的API的開銷(構(gòu)建參數(shù)元組等),如果我們可以寫一個(gè)純粹的C函數(shù)的話,我們也許能夠加快速度。

cdef externfrom"math.h":

floatcosf(floattheta)

floatsinf(floattheta)

floatacosf(floattheta)

cdef float_great_circle(floatlon1,floatlat1,floatlon2,floatlat2):

cdef floatradius=3956.0

cdef floatpi=3.14159265

cdef floatx=pi/180.0

cdef floata,b,theta,c

a=(90.0-lat1)*(x)

b=(90.0-lat2)*(x)

theta=(lon2-lon1)*(x)

c=acosf((cosf(a)*cosf(b))+(sinf(a)*sinf(b)*cosf(theta)))

returnradius*c

defgreat_circle(floatlon1,floatlat1,floatlon2,floatlat2,intnum):

cdef inti

cdef floatx

forifrom0< =?inum:

x=_great_circle(lon1,lat1,lon2,lat2)

returnx

請(qǐng)注意,我們?nèi)匀挥幸粋€(gè)Python函數(shù)( def ),它接受一個(gè)額外的參數(shù) num。這個(gè)函數(shù)里的循環(huán)使用for i from 0 < = i< num: ,而不是更Pythonic,但慢得多的for i in range(num):。真正的計(jì)算工作是在C函數(shù)(cdef)中進(jìn)行的,它返回float類型。這個(gè)版本只要0.2秒——比原先的Python函數(shù)速度提高10倍。

為了證明我們所做的已經(jīng)足夠優(yōu)化,可以用純C寫一個(gè)小應(yīng)用,然后測(cè)定時(shí)間:

#include

#include

#define NUM 500000

floatgreat_circle(floatlon1,floatlat1,floatlon2,floatlat2){

floatradius=3956.0;

floatpi=3.14159265;

floatx=pi/180.0;

floata,b,theta,c;

a=(90.0-lat1)*(x);

b=(90.0-lat2)*(x);

theta=(lon2-lon1)*(x);

c=acos((cos(a)*cos(b))+(sin(a)*sin(b)*cos(theta)));

returnradius*c;

}

intmain(){

inti;

floatx;

for(i=0;i< =?NUM;i++)

x=great_circle(-72.345,34.323,-61.823,54.826);

printf("%f",x);

}

用gcc -lm -octest ctest.c編譯它,測(cè)試用time./ctest …大約0.2秒 。這使我有信心,我Cython擴(kuò)展相對(duì)于我的C代碼也極有效率(這并不是說(shuō)我的C編程能力很弱)。

能夠用 cython 優(yōu)化多少性能通常取決于有多少循環(huán),數(shù)字運(yùn)算和Python函數(shù)調(diào)用,這些都會(huì)讓程序變慢。已經(jīng)有一些人報(bào)告說(shuō)在某些案例上 100 至 1000 倍的速度提升。至于其他的任務(wù),可能不會(huì)那么有用。在瘋狂地用 Cython重寫 Python 代碼之前,記住這一點(diǎn):

“我們應(yīng)該忘記小的效率,過(guò)早的優(yōu)化是一切罪惡的根源,有 97% 的案例如此。“——DonaldKnuth

換句話說(shuō),先用 Python 編寫程序,然后看它是否能夠滿足需要。大多數(shù)情況下,它的性能已經(jīng)足夠好了……但有時(shí)候真的覺得慢了,那就使用分析器找到瓶頸函數(shù),然后用cython重寫,很快就能夠得到更高的性能。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4826

    瀏覽量

    86567
  • C數(shù)據(jù)
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    1853

原文標(biāo)題:給力!Cython三分鐘入門教程

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    單片機(jī)編寫程序如何做到程序能夠正常運(yùn)行?

    在使用單片機(jī)編寫程序的時(shí)候,“裸奔”的情況下,有5-7個(gè)任務(wù),如何做到程序能夠正常運(yùn)行。
    發(fā)表于 08-06 06:20

    Cython 是什么?為什么會(huì)有 Cython

    Cython 估計(jì)很多人都聽說(shuō)過(guò),它是用來(lái)對(duì) Python 進(jìn)行加速的。如果你在使用 Python 編程時(shí),有過(guò)如下想法,那么 Cython 非常適合你。因?yàn)槟承┬枨髮?dǎo)致不得不編寫一些多重嵌套的循環(huán)
    發(fā)表于 06-16 16:11

    C語(yǔ)言編寫程序實(shí)現(xiàn)通過(guò)按鍵使LED燈周期閃爍

    C語(yǔ)言編寫程序實(shí)現(xiàn)通過(guò)按鍵使LED燈周期閃爍。
    發(fā)表于 03-30 16:54 ?10次下載

    單片機(jī)中獨(dú)立按鍵查詢方式編寫程序

    單片機(jī)中獨(dú)立按鍵查詢方式編寫程序的實(shí)際距離應(yīng)用
    發(fā)表于 06-08 14:10 ?9次下載

    VFP9.0編寫程序

    數(shù)據(jù)庫(kù)編寫程序,VFP9.0編寫程序,中文版利用數(shù)據(jù)庫(kù)知識(shí)編寫可以運(yùn)行程序
    發(fā)表于 06-21 16:42 ?1次下載

    Cython是什么,為什么會(huì)有Cython

    Cython 估計(jì)很多人都聽說(shuō)過(guò),它是用來(lái)對(duì) Python 進(jìn)行加速的。如果你在使用 Python 編程時(shí),有過(guò)如下想法,那么 Cython 非常適合你。 因?yàn)槟承┬枨髮?dǎo)致不得不編寫一些多重嵌套
    的頭像 發(fā)表于 06-16 16:11 ?2039次閱讀

    使用 RX65N 云套件開始編輯和編寫程序

    使用 RX65N 云套件開始編輯和編寫程序
    發(fā)表于 02-02 19:07 ?0次下載
    使用 RX65N 云套件開始編輯和<b class='flag-5'>編寫程序</b>

    關(guān)于stm32編寫程序的頭文件合集

    關(guān)于stm編寫程序的合集
    發(fā)表于 04-23 09:39 ?1次下載

    740族C編寫程序包V.1.01用戶手冊(cè)

    740族C編寫程序包V.1.01用戶手冊(cè)
    發(fā)表于 05-06 18:38 ?0次下載
    740族C<b class='flag-5'>編寫程序</b>包V.1.01用戶手冊(cè)

    PLC編寫程序編寫的是什么?

    對(duì)于PLC程序編寫,一個(gè)好的plc程序一般都具有程序的具有正確性、可靠性、方便性、簡(jiǎn)潔性和可讀性就是很好的程序!
    的頭像 發(fā)表于 05-10 17:38 ?2126次閱讀
    PLC<b class='flag-5'>編寫程序</b><b class='flag-5'>編寫</b>的是什么?

    740族C編寫程序包V.1.01用戶手冊(cè)

    740族C編寫程序包V.1.01用戶手冊(cè)
    發(fā)表于 06-26 20:24 ?0次下載
    740族C<b class='flag-5'>編寫程序</b>包V.1.01用戶手冊(cè)

    使用 RX65N 云套件開始編輯和編寫程序

    使用 RX65N 云套件開始編輯和編寫程序
    發(fā)表于 07-04 18:53 ?0次下載
    使用 RX65N 云套件開始編輯和<b class='flag-5'>編寫程序</b>

    虛擬機(jī)linux怎么編寫程序

    在虛擬機(jī)Linux上編寫程序是一項(xiàng)非常常見且有用的任務(wù)。無(wú)論是開發(fā)一個(gè)簡(jiǎn)單的腳本、一個(gè)Web應(yīng)用程序還是一個(gè)復(fù)雜的軟件項(xiàng)目,Linux提供了強(qiáng)大的工具和環(huán)境來(lái)幫助你進(jìn)行編程。本文將詳細(xì)介紹如何在
    的頭像 發(fā)表于 11-17 10:08 ?2365次閱讀

    怎樣在codeblocks上編寫程序

    在CodeBlocks上編寫程序是一項(xiàng)相對(duì)簡(jiǎn)單而又重要的任務(wù)。CodeBlocks是一個(gè)廣泛使用的集成開發(fā)環(huán)境(IDE),它能夠幫助程序編寫、編譯和運(yùn)行他們的代碼。在本篇文章中,我們
    的頭像 發(fā)表于 11-26 09:26 ?2157次閱讀

    codeblocks怎么編寫程序

    ::Blocks編寫程序的過(guò)程,以使您對(duì)其操作有更深入的了解。 首先,我們需要下載并安裝Code::Blocks。您可以在官方網(wǎng)站https://www.codeblocks.org/上找到適用于您的操作系統(tǒng)的安裝程序。安裝過(guò)程相對(duì)簡(jiǎn)單,只需按照向?qū)е甘就瓿杉纯伞?一旦安
    的頭像 發(fā)表于 11-26 10:28 ?2045次閱讀
    主站蜘蛛池模板: 九江县| 满城县| 太和县| 宁河县| 津市市| 灵石县| 东兰县| 焦作市| 罗平县| 封开县| 博兴县| 万年县| 图木舒克市| 盐源县| 西藏| 普定县| 宾阳县| 红原县| 榕江县| 泗水县| 苍南县| 南丹县| 海淀区| 克什克腾旗| 黑龙江省| 卫辉市| 福建省| 永州市| 乾安县| 太谷县| 马鞍山市| 聊城市| 大竹县| 馆陶县| 镇远县| 潞城市| 保靖县| 永顺县| 古丈县| 建湖县| 祁门县|