精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入對比數(shù)據(jù)科學工具箱:Python和R的C/C++實現(xiàn)

開發(fā) 開發(fā)工具
Python和R實際上是用C實現(xiàn)的,這是條阻力最小的路徑。C是一門古老語言,C語言社區(qū)已經(jīng)演進出了一些強大的工具鏈。晦澀的編譯器錯誤消息已經(jīng)成為了過去時,GCC和Clang(最流行的編譯器)給友善的消息反饋(Clang網(wǎng)站可以看到栗子)。現(xiàn)在還有各種各樣的“消毒液”來輔助捕獲內存泄漏等常見錯誤或未定義的行為(llvm文檔)。

概述

幾周前,我有幸在 Scipy 大會上發(fā)表了 Civis如何使用Python和R的演講。為什么要在一個Python大會上大談R呢?這是要挑起一個Python和R語言的一場戰(zhàn)爭嗎?不是的!討論哪個語言比較好簡直是浪費時間。在 Civis,我們很愉快地同時使用這兩種語言,不僅僅是在我們日常工作中解決數(shù)據(jù)科學問題,也用它們來寫一些其他工具。下面是我在SciPy 大會上的一些討論。

問題現(xiàn)狀

我們 Civis 的同事有著十分不同的學術背景。我效力的研發(fā)團隊有一個物理學家、一個經(jīng)濟學家、兩個統(tǒng)計學家以及一位土木工程師組成。在 Civis,每個人在數(shù)據(jù)科學上都會做一些不同內容的工作,有的領域是R比較流行,有的領域是Python比較流行,還有的一些是Matlab。在這種場景下只支持一種語言并不是一個明智的選擇。遷移到一門新語言上會花費許多時間,拋開在學院或者業(yè)界多年的技能回報,允許人們使用它們所熟悉的工具可以確保大家有更高的生成效率。

另外一個我們同時使用兩種語言的原因是已有的統(tǒng)計學工具與包。在解決數(shù)據(jù)科學問題上,我們經(jīng)常遇到在某些特定管道上需要某一種特定語言。我們的調研管道是一個很好的例子。確保隨機樣本具有全集代表性是需要一個被稱為 raking 的過程的,傳統(tǒng)上,Python 在社會科學上并不流行,因此我們只會用R來完成這件事情。當然調查也包括了QA的全文檢索,在某種程度上來說R在NLP社區(qū)上并不是很流行,因此這個部分將會由Python來完成。而分析調查數(shù)據(jù)只是我們在Civis解決問題的一個小步驟。

結合許多不同的語言來實現(xiàn)工作流是具有挑戰(zhàn)性的。數(shù)據(jù)科學平臺幫助我們可以提交一連串任務節(jié)點,然后交由基礎設施負責獨立調用每個任務節(jié)點,且前后不依賴。但是這并不是一個十分理想的情況。原因有二,其一,這樣做整個任務就顯得破碎化,稍有修改某個任務,往往會導致全局失敗,而且任何人在這個分布式系統(tǒng)中所做的工作都只了解局部情況,而不知道全局情況。第二,這樣做并不高效。在兩個語言中切換通常需要將數(shù)據(jù)以特定格式加載到磁盤上(通常最壞的情況是csv格式)。這樣不僅僅是解析成本比較高,而且還會丟失一些類型信息。

解決方案

我概述了在Civis遇到的種種問題,但是到底什么是理想的狀態(tài)呢?最***的解決方案是我們可以無縫切換工具和語言。許多熟悉Python的人喜歡用Python做數(shù)據(jù)分析,R也是類似的。事實證明這是完全有可能實現(xiàn),有相當數(shù)量的項目已經(jīng)開始作為跨語言工具:TensorFlow, XGBoost, 和 Stan 都在Civis被廣泛運用。移植或安利一個已有的工具也是可能的,我們已經(jīng)成功地完成了glmnetR包的安利。

對另一些為讀者寫數(shù)據(jù)科學工具的人來說,他們從一開始就考慮了這些跨語言。有一些方法可以做到這一點,但我個人最喜歡的是用C語言來寫底層,然后使用各自的Python和R C api做一些綁定/封裝。Python和R實際上是用C實現(xiàn)的,這是條阻力最小的路徑。C是一門古老語言,C語言社區(qū)已經(jīng)演進出了一些強大的工具鏈。晦澀的編譯器錯誤消息已經(jīng)成為了過去時,GCC和Clang(***的編譯器)給友善的消息反饋(Clang網(wǎng)站可以看到栗子)。現(xiàn)在還有各種各樣的“消毒液”來輔助捕獲內存泄漏等常見錯誤或未定義的行為(llvm文檔)。

案例

下面我們通過一個小例子,用C編寫一個函數(shù),使這可調用的Python和R。代碼以及幻燈片從我的GitHub上可以找到。

Python

我們將下面的Python函數(shù)轉換為C:

  1. def tally(s): 
  2.     total = 0 
  3.     for elm in s: 
  4.         total += elm 
  5.     return total  

C

這是相同的功能用C實現(xiàn):

  1. #include <stddef.h> 
  2.  
  3. double tally(double *s, size_t n) { 
  4.     double total = 0; 
  5.     for (size_t i = 0; i < n; i++) { 
  6.         total += s[i]; 
  7.     } 
  8.     return total; 
  9.  

注意到它看起來并不是都不同的Python函數(shù)。當然,除了有一些類型注解和額外的語法噪音大括號外,我們還必須跟蹤數(shù)組的長度,但整體邏輯是一樣的。

接下來,我們需要實現(xiàn)一個Python綁定,允許用戶調用這個函數(shù)就像任何其他Python函數(shù)。

Cython 

  1. #include <stdio.h> 
  2. #include "Python.h" 
  3. #include "tally.h" 
  4.  
  5. static PyObject *tally_(PyObject *self, PyObject *args) { 
  6.     PyObject *buf; 
  7.     if (!PyArg_ParseTuple(args, "O", &buf)) { 
  8.         return NULL
  9.     } 
  10.  
  11.     Py_buffer view
  12.     int buf_flags = PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT; 
  13.     if (PyObject_GetBuffer(buf, &view, buf_flags) == -1) { 
  14.         return NULL
  15.     } 
  16.      
  17.     if (strcmp(view.format,"d") != 0) { 
  18.         PyErr_SetString(PyExc_TypeError, "we only take floats :("); 
  19.         PyBuffer_Release(&view); 
  20.         return NULL
  21.     } 
  22.  
  23.     double result = tally(view.buf, view.shape[0]); 
  24.     PyBuffer_Release(&view); 
  25.     return Py_BuildValue("d", result); 
  26.  
  27. static PyMethodDef MethodTable[] = { 
  28.     {"tally", &tally_, METH_VARARGS, "Compute the sum of an array"},  
  29.     { NULLNULL, 0, NULL
  30. }; 
  31.  
  32. static struct PyModuleDef tally_module = { 
  33.     .m_base = PyModuleDef_HEAD_INIT, 
  34.     .m_name = "tally_"
  35.     .m_size = -1, 
  36.     .m_methods = MethodTable 
  37. }; 
  38.  
  39.  
  40. PyMODINIT_FUNC PyInit_tally_(void) { 
  41.     return PyModule_Create(&tally_module); 
  42.  

這里有很多實現(xiàn)的方法,但大多數(shù)只是Python模塊的一部分樣板代碼。

在最上面,我們定義了一個函數(shù),它接受一個Python對象,并且檢查這是一個適當類型的數(shù)組,再調用我們的計數(shù)功能,然后返回結果。其余的代碼模塊定義,告訴Python解釋器我們計數(shù)功能的名稱和它的參數(shù)類型。

R

R的過程非常相似,但是更加簡潔:

  1. #include <R.h> 
  2. #include <Rinternals.h> 
  3. #include <R_ext/Rdynload.h> 
  4. #include "tally.h" 
  5.  
  6. SEXP tally_(SEXP x_) { 
  7.   double *x = REAL(x_); 
  8.   int n = length(x_); 
  9.    
  10.   SEXP out = PROTECT(allocVector(REALSXP, 1)); 
  11.   REAL(out)[0] = tally(x, n); 
  12.   UNPROTECT(1); 
  13.    
  14.   return out
  15.  
  16. static R_CallMethodDef callMethods[] = { 
  17.   {"tally_", (DL_FUNC)&tally_, 1}, 
  18.   {NULLNULL, 0} 
  19. }; 
  20.  
  21. void R_init_tallyR(DllInfo *info) { 
  22.   R_registerRoutines(info, NULL, callMethods, NULLNULL); 

 這里需要的代碼量顯著減少,因為R和Python類型系統(tǒng)有所不同,沒有真正標量類型,所以我們不需要做相同級別的檢驗/驗證用戶輸入我們在上面的Python示例。剩下的代碼大致相同,我們定義一個組函數(shù)可在R編譯。

總結

一個真實世界的例子一定會更加復雜,但整個過程并不是那么困難。在編寫跨語言工具時有幾件事要記住:

  • 如果你打算在兩者之間共享函數(shù)就不要依賴宿主語言的api(R或Python)代碼。
  • 使用錯誤碼來傳遞異常提示,不要直接調用退出或者在宿主語言里面才處理異常。
  • ***用宿主語言負責內存分配和重分配,這意味著你的C/C++代碼應該要略過預先分配的內存和輸出過程。
  • 相信編譯器,你也應該重視編譯器的錯誤和警告。如果代碼在編譯時有警告那代碼就不算寫完。

無論是哪個“贏得”這場語言戰(zhàn)爭,Python和R都將保持在數(shù)據(jù)科學屆的地位。這意味著為工具開發(fā)者不能忽視的另外一門語言,構建有用的工具就得保證這兩種語言都可以使用。一個簡單的方式是用C或c++編寫大量代碼,然后用 C 的 API的為兩種語言提供封裝。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2016-08-10 13:51:23

PythonR異常處理

2020-03-03 19:00:50

C語言數(shù)據(jù)科學

2024-05-15 16:01:04

C++編程開發(fā)

2010-01-25 14:04:17

Android Wid

2024-04-19 13:02:27

容器C++

2018-11-01 08:49:28

數(shù)據(jù)科學數(shù)據(jù)科學工具數(shù)據(jù)分析

2018-12-17 09:00:00

大數(shù)據(jù)數(shù)據(jù)科學工具

2022-06-01 13:52:11

開源大數(shù)據(jù)

2010-03-09 19:39:37

python程序調試

2023-06-19 10:30:04

Python工具數(shù)據(jù)科學工具

2013-06-07 13:30:20

2009-12-14 14:00:39

VS 關系圖

2017-02-14 10:17:08

軟件咨詢師工具箱

2010-01-04 18:11:44

Silverlight

2021-01-18 08:10:35

安全工具病毒

2024-04-10 12:14:36

C++指針算術運算

2011-04-11 09:43:25

C++C

2015-05-27 14:26:05

2009-10-10 13:09:45

2023-12-01 15:10:56

點贊
收藏

51CTO技術棧公眾號

国产99一区视频免费| 99久久精品费精品国产| 午夜视频一区在线观看| 国内视频一区二区| 精品乱码一区内射人妻无码| 久久在线视频免费观看| 欧美videossexotv100| 99999精品视频| 免费看a在线观看| 成人中文字幕合集| 国产精品视频精品| 国产精品第56页| 日产精品一区二区| 精品成人在线观看| 天天干天天操天天做| 国产激情在线播放| 日韩毛片在线免费观看| 久久久久久久久久久久久久一区 | 成人bbav| 中文字幕中文在线不卡住| 国产欧美在线一区二区| 亚洲一区二区人妻| 免费在线欧美黄色| 欧美精品videos| 久久一级免费视频| 亚洲精品3区| 欧美成人综合网站| 欧美特黄aaa| 欧美亚洲韩国| 图片区小说区国产精品视频| 国产盗摄视频在线观看| 福利片在线观看| 91丨九色丨蝌蚪丨老版| 99久热re在线精品996热视频| 国产精品无码粉嫩小泬| 国产欧美激情| 久久久噜噜噜久久久| av最新在线观看| 欧美日韩在线二区| 亚洲欧洲在线观看| 青青草视频成人| 亚洲综合网狠久久| 日韩欧美黄色影院| 手机在线视频一区| 亚洲精品大片| 欧美日韩国产中文| 亚洲一区二区蜜桃| 欧美性xxx| 在线视频欧美区| 波多野结衣作品集| 一区在线影院| 精品视频全国免费看| 男人搞女人网站| 97成人超碰| 欧美日韩五月天| 亚洲一级免费观看| 欧美视频第一| 欧美日韩一卡二卡| 色婷婷一区二区三区在线观看| 性欧美video另类hd尤物| 欧美三级视频在线| 久久久精品麻豆| 91天天综合| 欧美妇女性影城| 午夜诱惑痒痒网| 国产一区二区久久久久| 日韩欧美中文字幕公布| 自拍视频第一页| 国产女人18毛片水真多18精品| 亚洲国产精品网站| 蜜桃无码一区二区三区| 精品国产aⅴ| 久久久精品美女| 免费网站观看www在线观| 午夜国产欧美理论在线播放| 久久久天堂国产精品女人| 精品无码人妻一区二区三| 9久re热视频在线精品| 欧洲美女免费图片一区| 中文字幕 国产| 国产精品一区在线观看乱码| 国产精品国产一区二区| 欧美香蕉爽爽人人爽| 国产精品视频线看| 国产爆乳无码一区二区麻豆| 色多多在线观看| 欧美日韩中文字幕精品| 韩国三级与黑人| 婷婷成人综合| 久久久精品国产网站| 日本一二三区视频| 日韩精彩视频在线观看| 亚洲free嫩bbb| 亚洲人妻一区二区| 中文字幕在线不卡| 精品欧美一区免费观看α√| 影音成人av| 精品av综合导航| 一级特黄曰皮片视频| 欧美精品偷拍| 国产精品久久久久不卡| 肥臀熟女一区二区三区| 中文字幕欧美国产| 国产v片免费观看| 亚洲成人a级片| 精品视频—区二区三区免费| 日本天堂中文字幕| 快she精品国产999| 国产精成人品localhost| yourporn在线观看视频| 亚洲成av人片一区二区梦乃| 黄色一级片免费的| 久久av导航| 久久91精品国产| 中文区中文字幕免费看| 99久久精品免费看国产免费软件| 亚洲欧洲一区二区| 亚洲精品88| 亚洲成人激情图| 永久免费未视频| 日韩国产在线一| 韩国成人动漫在线观看| av毛片在线看| 91国内精品野花午夜精品| 久久久国产精品久久久| 欧美oldwomenvideos| 热re91久久精品国99热蜜臀| 亚洲国产精品成人久久蜜臀| 最新欧美精品一区二区三区| 成年人网站大全| 久久夜色电影| 久久久久亚洲精品国产| www.国产欧美| 亚洲人成在线观看一区二区| 国产主播中文字幕| 精品大片一区二区| 国产精品av网站| 欧美一区二区视频| 一本色道久久综合亚洲精品按摩| 国产激情第一页| 亚洲高清av| 国产精品一区二区a| 色呦呦在线资源| 日韩欧美国产精品一区| 欧美国产日韩综合| 国产在线不卡一区| 男同互操gay射视频在线看| 欧美黄色成人| 久久福利网址导航| 亚洲不卡免费视频| 亚洲资源中文字幕| 亚洲无人区码一码二码三码| 亚洲私拍自拍| 国产区一区二区三区| av中文字幕在线看| 亚洲韩国青草视频| 女人十八岁毛片| 99国产精品一区| www国产黄色| 精品免费在线| 成人亚洲综合色就1024| 亚洲色图美国十次| 亚洲国产毛片完整版| 黄色片网站在线免费观看| 国产三级精品在线| 五月激情婷婷在线| 欧美精品日本| 欧美成ee人免费视频| 国产精品传媒麻豆hd| 久久色在线播放| 欧美一级淫片aaaaaa| 色综合 综合色| 亚洲熟女少妇一区二区| 国产不卡视频一区二区三区| 男人用嘴添女人下身免费视频| 欧美丝袜美腿| 国产精品视频xxx| 2024短剧网剧在线观看| 亚洲国产精品va在线| 欧美黄色一级大片| 亚洲视频一区二区在线| 国产精品成人无码专区| 日韩高清在线不卡| 狠狠精品干练久久久无码中文字幕 | 精品成人一区二区三区免费视频| 欧美撒尿777hd撒尿| 丁香花五月激情| 久久久久九九视频| 国产精品嫩草影视| 美女网站久久| 992tv快乐视频| av资源久久| 国产另类自拍| 国产亚洲精彩久久| 97欧美精品一区二区三区| 五月婷婷在线观看| 亚洲国产成人久久综合一区| 久久精品偷拍视频| 亚洲国产成人porn| 久久福利免费视频| 91色porny| 人妻少妇偷人精品久久久任期| 美女诱惑一区| 日韩av在线播放不卡| 日韩欧美视频| 久久国产欧美精品| 欧美三级一区| 国产免费一区二区三区在线能观看 | 精品国产乱码久久久久久蜜臀网站| 欧美体内谢she精2性欧美| 日本高清一二三区| 亚洲国产精品ⅴa在线观看| 黑人玩弄人妻一区二区三区| 久久国内精品自在自线400部| 久久国产午夜精品理论片最新版本| 日韩在线二区| 日韩片电影在线免费观看| 福利片在线一区二区| 成人免费视频网| 日韩三区免费| 欧美野外猛男的大粗鳮| 国产精品69xx| 欧美大片网站在线观看| 午夜视频在线免费观看| 国产午夜精品全部视频在线播放 | 久久久久国产精品厨房| 男女性杂交内射妇女bbwxz| 极品尤物av久久免费看| 国产精品无码av无码| 亚洲综合社区| 久久久久久久久久网| 欧美福利视频| 看一级黄色录像| 99tv成人| 一区二区三区四区视频在线| 神马影视一区二区| 欧美午夜精品理论片a级大开眼界| 国产极品模特精品一二| 成人免费视频网站| 在线观看视频一区二区三区| 91麻豆蜜桃| 欧美片网站免费| 岛国视频一区| 精品av导航| 久久精品国产美女| 欧美调教视频| 蜜桃传媒一区二区| 久久成人高清| 亚洲第一导航| 亚洲成人国产| 大陆极品少妇内射aaaaaa| 综合天堂av久久久久久久| 日本福利视频网站| 亚洲精品乱码| avav在线看| 免费的成人av| 日本在线观看视频一区| 国产91丝袜在线18| 挪威xxxx性hd极品| 97se亚洲国产综合自在线不卡| 无码人妻aⅴ一区二区三区| 久久久精品综合| 欧美黄色高清视频| 亚洲精品成人在线| 久久综合久久鬼| 懂色av一区二区三区| www.欧美色| 欧美精品在线视频| 亚洲av无码一区二区三区性色 | 好吊色视频一区二区三区| 91香蕉视频在线| a级黄色免费视频| 亚洲综合区在线| 羞羞影院体验区| 欧美久久久久中文字幕| www.日韩高清| 国产午夜精品麻豆| 欧美96在线| 97久久超碰福利国产精品…| 亚洲同志男男gay1069网站| 国产精品久久不能| 日韩精品一区二区三区中文字幕 | 国内一区二区三区| 国产a级一级片| 国产一区在线观看视频| 一本加勒比波多野结衣| 国产精品久久久久精k8 | 国产经典一区二区三区| 国产乱码精品一区二区亚洲| 成年丰满熟妇午夜免费视频| 久久成人一区| 久久久久中文字幕亚洲精品| 久久久久久久精| 久久黄色小视频| 欧美性做爰猛烈叫床潮| 蜜桃91麻豆精品一二三区| 亚洲欧美日韩网| 肉体视频在线| 国产精品普通话| 美国一区二区| 日韩中文在线字幕| 视频一区免费在线观看| 亚洲乱妇老熟女爽到高潮的片| 国产人妖乱国产精品人妖| 免费麻豆国产一区二区三区四区| 欧美自拍偷拍一区| 天天干天天做天天操| 超碰日本道色综合久久综合| 性欧美videohd高精| 国产伦理久久久| 91精品久久久久久久久久不卡| wwwxxx黄色片| 91视视频在线观看入口直接观看www| 欧美黄色aaa| 欧美喷潮久久久xxxxx| 极品美乳网红视频免费在线观看| 久久久久久有精品国产| 亚洲综合视频| 亚洲欧美日韩精品久久久 | 亚洲制服丝袜在线| 国产精品视频一区二区三区,| 亚洲小视频在线观看| 少妇淫片在线影院| 国产亚洲欧美一区二区| 欧美精品麻豆| 中国老熟女重囗味hdxx| 亚洲三级电影全部在线观看高清| 国产成人无码专区| 精品在线欧美视频| 国产精品xx| 激情伦成人综合小说| 国色天香一区二区| 无码人妻久久一区二区三区蜜桃| **欧美大码日韩| 999精品国产| 久久国产天堂福利天堂| 91精品福利观看| 热这里只有精品| 精品一区二区av| 男人操女人的视频网站| 91精品黄色片免费大全| 国产一二区在线观看| 亚洲综合日韩中文字幕v在线| 一区二区影院| 潘金莲一级淫片aaaaaaa| 一区二区三区在线观看欧美 | 国产aⅴ综合色| 午夜偷拍福利视频| 亚洲精品99999| 成人免费看视频网站| 奇米视频888战线精品播放| 久久久久国产一区二区| 少妇太紧太爽又黄又硬又爽小说| 欧美视频在线不卡| 国产在线二区| 国产精品一区二区三区免费观看| 99精品国产在热久久下载| 玖草视频在线观看| 91国在线观看| 黄色网页在线观看| 国产激情美女久久久久久吹潮| 亚洲激情社区| 亚洲自拍偷拍一区二区| 日本韩国欧美一区| 在线免费观看黄色av| 亚洲综合精品伊人久久| 夜夜夜久久久| 国产又黄又粗的视频| 91麻豆精品久久久久蜜臀| wwwww亚洲| 日韩一区二区三区高清| 国产精品一区二区果冻传媒| 91香蕉在线视频| 在线电影中文日韩| 亚洲一区二区三区中文字幕在线观看| 人妻av中文系列| 国产精品色噜噜| 亚洲av无码一区二区乱子伦| 日本中文字幕久久看| 国产精品久久久乱弄| 国产国语老龄妇女a片| 色婷婷综合久色| av在线导航| 欧美综合77777色婷婷| 激情欧美一区二区| 色网站在线播放| 久久亚洲精品一区二区| 日本久久成人网| 成人性生交视频免费观看| 天天操天天干天天综合网| 在线看黄色av| 九九九九精品九九九九| 精品一区二区三区香蕉蜜桃| 国产视频91在线| 久精品免费视频| 日本电影一区二区| 日本护士做爰视频| 欧美一级黄色片| 秋霞国产精品| 成 年 人 黄 色 大 片大 全|