国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Cython 三分鐘入門教程

2020-02-23 04:43:52
字體:
來源:轉載
供稿:網友

作者:perrygeo
譯者:賴勇浩(http://laiyonghao.com)
原文:http://www.perrygeo.net/wordpress/?p=116

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

編輯:根據一些我收到的反饋,大家似乎有點混淆——Cython是用來生成 C 擴展到而不是獨立的程序的。所有的加速都是針對一個已經存在的 Python 應用的一個函數進行的。沒有使用 C 或 Lisp 重寫整個應用程序,也沒有手寫C擴展 。只是用一個簡單的方法來整合C的速度和C數據類型到 Python 函數中去。

現在可以說,我們能使下文的 great_circle 函數更快。所謂 great_circle 是計算沿地球表面兩點之間的距離的問題:

p1.py

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)))

    return radius*c

讓我們調用它 50 萬次并測定它的時間 :

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秒 。它太慢了!

讓我們試著快速地用Cython改寫它,然后看看是否有差別:
c1.pyx

import math

 

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

    cdef float radius = 3956.0

    cdef float pi = 3.14159265

    cdef float x = pi/180.0

    cdef float a,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)))

    return radius*c

請注意,我們仍然import math——cython讓您在一定程度上混搭Python和C數據類型在。轉換是自動的,但并非沒有代價。在這個例子中我們所做的就是定義一個Python函數,聲明它的輸入參數是浮點數類型,并為所有變量聲明類型為C浮點數據類型。計算部分它仍然使用了Python的 math 模塊。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 共和县| 措勤县| 兴文县| 潜江市| 河南省| 新河县| 水富县| 柳州市| 叶城县| 德兴市| 孝义市| 海城市| 鄂温| 天峻县| 乐昌市| 盘锦市| 雷州市| 城市| 岐山县| 梅河口市| 迭部县| 巨鹿县| 长子县| 南靖县| 五华县| 洛宁县| 信宜市| 沅陵县| 丘北县| 海晏县| 保靖县| 建昌县| 武威市| 青川县| 名山县| 河北省| 聊城市| 鹤庆县| 庄浪县| 盐边县| 庄浪县|