精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

午夜精品久久久久久久久久久久 | 成人性生交大片免费看视频在线 | 午夜欧美巨大性欧美巨大| 国产欧美精品一区aⅴ影院| 成人激情在线观看| 日韩欧美大片在线观看| 精品国产91久久久久久浪潮蜜月| 欧美精品三级在线观看| 欧美黑人经典片免费观看| www 日韩| av中文字幕不卡| 国产免费一区二区三区在线观看| 日韩欧美亚洲一区二区三区| 日韩电影在线视频| 日韩成人在线视频网站| www激情五月| 在线观看欧美日韩电影| 亚洲免费视频成人| 日韩av高清在线播放| 性生活免费网站| 喷白浆一区二区| 午夜精品一区二区三区在线 | 日本高清中文字幕二区在线| 激情文学综合丁香| 欧美中在线观看| 精品少妇一二三区| 久久久久国产精品| 尤物九九久久国产精品的特点| 欧洲成人午夜精品无码区久久| 不卡亚洲精品| 色呦呦网站一区| 日本少妇高潮喷水视频| 七七成人影院| 亚洲精品国久久99热| 亚洲一区不卡在线| 免费国产在线观看| 91香蕉国产在线观看软件| 国产欧美日本在线| 亚洲精品无码久久久| 国产资源精品在线观看| 国产欧洲精品视频| 中文字幕福利视频| 免费看日韩精品| 国产精品美女主播在线观看纯欲| 亚洲欧美自拍视频| 久久精品国语| 日本三级久久久| 国产字幕在线观看| 亚洲三级免费| 性欧美长视频免费观看不卡| 日本中文在线视频| 永久亚洲成a人片777777| www.美女亚洲精品| 亚洲女人毛茸茸高潮| 久久中文字幕av一区二区不卡| 在线看欧美日韩| 谁有免费的黄色网址| av在线不卡顿| 中文字幕亚洲自拍| 久久福利免费视频| 欧美 日韩 国产一区二区在线视频 | 亚洲高清在线视频| 99久久国产综合精品五月天喷水| 丰乳肥臀在线| 懂色av一区二区三区| 国产乱子伦农村叉叉叉| 在线毛片观看| 欧美亚洲国产一区二区三区va| 久久婷婷国产91天堂综合精品| 天然素人一区二区视频| 欧美人体做爰大胆视频| 91网址在线观看精品| 一区视频网站| 精品无人区太爽高潮在线播放 | 国产亚洲一区二区三区不卡| 一区二区欧美久久| 26uuu成人网| 亚洲福利国产| 国产精品aaa| 国产乱子伦精品无码码专区| 懂色中文一区二区在线播放| 精品视频免费观看| 大地资源中文在线观看免费版| 国产精品美女久久久久aⅴ | 久久一级免费视频| 永久91嫩草亚洲精品人人| 午夜欧美大片免费观看| 中文字幕人妻一区二区三区视频| 国产一区二区福利| 久久免费99精品久久久久久| 在线观看麻豆| 亚洲妇熟xx妇色黄| 日韩精品无码一区二区三区免费| 一区在线不卡| 亚洲女人被黑人巨大进入al| 日韩在线视频网址| 国产精品久久久免费 | 日本亚洲视频| 亚洲欧美综合另类中字| 精品自拍偷拍视频| 久久国产精品久久w女人spa| 亚洲已满18点击进入在线看片| 深夜福利在线看| 亚洲三级在线观看| 男人亚洲天堂网| 日本超碰一区二区| 亚洲一区第一页| 精品无码一区二区三区电影桃花| 天堂影院一区二区| 国产成人成网站在线播放青青| av大全在线免费看| 欧美日韩在线第一页| 日本美女久久久| 青草国产精品| 日本久久久久亚洲中字幕| 亚洲精品911| 国产精品久久99| 北条麻妃视频在线| 日韩精品导航| 欧美激情一二三| 91久久久久国产一区二区| 久久伊人蜜桃av一区二区| 日本大片免费看| 国产电影一区二区| 在线日韩第一页| 69国产精品视频免费观看| 成人午夜视频在线观看| 男人天堂成人网| 亚洲色图综合| www.亚洲人.com| 日韩久久久久久久久久| 久久久久久9999| 日本免费黄视频| 久久aimee| 国自在线精品视频| 亚洲av无码片一区二区三区| 亚洲欧美激情插| 亚洲精品中文字幕乱码无线| 99久久这里只有精品| 国产日韩换脸av一区在线观看| gogogo高清在线观看免费完整版| 色综合久久88色综合天天| 少妇一级淫片免费放播放| 激情婷婷久久| 国产亚洲第一区| 都市激情国产精品| 亚洲精品福利免费在线观看| 色播视频在线播放| 99久精品国产| 无码精品国产一区二区三区免费| 欧美丝袜足交| 日韩av片电影专区| 国产高清在线看| 欧美日韩一区二区不卡| 麻豆一区在线观看| 国产在线不卡一区| 国产高清不卡无码视频| 99精品在免费线中文字幕网站一区| 欧美激情国产日韩精品一区18| 亚洲免费国产视频| 午夜电影一区二区三区| 久久国产精品无码一级毛片| 久久成人在线| 亚洲春色在线视频| 超碰国产精品一区二页| 久久91亚洲精品中文字幕| 欧美一级淫片免费视频魅影视频| 精品久久久视频| 婷婷丁香综合网| 国产麻豆成人传媒免费观看| 蜜桃传媒一区二区三区| 国产精品一区2区3区| 国产日韩在线视频| 免费在线观看av电影| 国产视频精品久久久| 91精品国产乱码久久久久| 亚洲精品国久久99热| 欧美熟妇精品黑人巨大一二三区| 久久久噜噜噜久久狠狠50岁| 中文字幕一区二区三区最新 | 亚洲成人精品在线| 综合网在线观看| 亚洲欧美在线观看| 网站免费在线观看| 久久电影网电视剧免费观看| 人人妻人人做人人爽| 精品国产乱码| 痴汉一区二区三区| 88xx成人永久免费观看| 欧美成人精品一区| 你懂得在线网址| 在线播放中文一区| 国产成人免费观看视频| 中文字幕在线不卡视频| 一区二区视频观看| 国内精品久久久久影院一蜜桃| 成人av一级片| 欧美伊人久久| 色99中文字幕| 欧美成人一区在线观看| 91色精品视频在线| 国产成人免费9x9x人网站视频| 久久综合色88| 成年网站在线| 日韩精品在线第一页| av中文字幕观看| 欧美视频一区二区三区| 亚州国产精品视频| 亚洲日穴在线视频| 黄色片网站免费| 暴力调教一区二区三区| 久久久久久综合网| 日韩精品1区2区3区| 男女视频网站在线观看| 亚洲91视频| 亚洲欧洲精品一区| 免费不卡中文字幕在线| 国产精品麻豆免费版| 99久久99九九99九九九| 国产精品美女www| 欧美xxxxxx| 97香蕉久久超级碰碰高清版| 亚洲国产精品精华素| 中文字幕日韩精品在线观看| 日韩一二三四| 亚洲精品理论电影| 黄色成人一级片| 欧美大片在线观看一区二区| 99精品在线看| 91精品福利在线一区二区三区| 国产美女www| 欧美综合在线视频| 五月婷婷激情视频| 欧美性高潮床叫视频| 久久久久久久久久久97| 一区二区不卡在线播放| 毛片a片免费观看| 亚洲精品国产视频| av激情在线观看| 亚洲三级免费观看| 亚洲综合网在线| 亚洲免费观看高清完整版在线观看 | 亚洲天堂网中文字| 国产黄色录像片| 成人免费在线播放视频| 神马午夜精品91| 亚洲精品国产高清久久伦理二区| 永久久久久久久| 亚洲激情男女视频| 久久视频免费看| 五月婷婷激情综合| 特级西西444www大精品视频免费看| 五月婷婷综合网| 一二三区免费视频| 欧美日韩精品一二三区| 国产一区二区网站| 日韩欧美一区在线观看| 免费av网站在线播放| 亚洲精品不卡在线| 欧美挠脚心网站| 综合av色偷偷网| www久久日com| 97精品国产91久久久久久| 超碰国产一区| 国产日韩换脸av一区在线观看| 欧美成人一级| 九九九久久久| 欧美丝袜一区| 中文字幕一区二区三区在线乱码 | 啪啪亚洲精品| 中文字幕中文字幕一区三区| 国产精品扒开腿做爽爽爽软件| 国产毛片视频网站| 日韩激情一区二区| 久久久精品视频国产| 成人激情文学综合网| 成人影视免费观看| 成人欧美一区二区三区视频网页| 清纯粉嫩极品夜夜嗨av| 欧美午夜激情在线| 91麻豆国产在线| 亚洲国产欧美日韩精品| av色图一区| 久久免费视频这里只有精品| 日韩不卡视频在线观看| 91嫩草在线| 国产九一精品| 欧美图片激情小说| 蜜臀av一区二区| 四虎成人免费视频| 中文字幕巨乱亚洲| 国产精品6666| 欧美男男青年gay1069videost| 日本精品一区二区在线观看| 久久精品国产一区二区三区 | 91黄视频在线| 精品人妻一区二区三区四区不卡| 亚洲网址你懂得| 国语对白在线刺激| 国产精品永久免费观看| 日韩成人动漫在线观看| 男插女免费视频| 日日摸夜夜添夜夜添国产精品| 佐佐木明希电影| 国产精品久久三| 东京热一区二区三区四区| 精品久久人人做人人爱| jizz视频在线观看| 欧美一性一乱一交一视频| 视频精品一区二区三区| 亚洲巨乳在线观看| 欧美综合二区| 7788色淫网站小说| 亚洲综合在线观看视频| 一本色道久久综合亚洲| 一区二区亚洲精品国产| www.成人影院| 久久精品日产第一区二区三区| 欧美一区影院| 伊人成人免费视频| 一区视频在线播放| 中文字幕一区二区三区四区视频| 日韩精品日韩在线观看| 24小时免费看片在线观看| 91超碰rencao97精品| 91久久高清国语自产拍| 第四色婷婷基地| 国产欧美精品在线观看| 亚洲 欧美 日韩 在线| 日韩精品高清在线| 末成年女av片一区二区下载| 国产精品我不卡| 国产精品theporn| 美女又黄又免费的视频| 成人免费视频在线观看| 国产免费不卡视频| 欧美成人免费大片| 日韩黄色av| 亚洲乱码日产精品bd在线观看| 国产一区二区剧情av在线| 日韩高清dvd碟片| 欧美一三区三区四区免费在线看 | 亚洲精品传媒| 91精品久久久久久| 亚洲精彩视频| 精品人妻无码中文字幕18禁| 亚洲综合丁香婷婷六月香| 亚洲免费黄色片| 91国在线精品国内播放| 天海翼精品一区二区三区| 日本成年人网址| 欧美韩国日本综合| 一级黄色片在线观看| 久久伊人精品视频| 中文字幕区一区二区三| 国产免费观看高清视频| 久久影院电视剧免费观看| 中文区中文字幕免费看| www日韩欧美| 视频精品一区二区三区| 亚洲自偷自拍熟女另类| 国产视频在线观看一区二区三区| 自拍偷拍色综合| 蜜臀久久99精品久久久无需会员 | 日韩三级av在线| 亚洲美女精品成人在线视频| 91超碰碰碰碰久久久久久综合| 一本一生久久a久久精品综合蜜 | 日韩一区二区电影| aa级大片免费在线观看| 欧美日韩国产综合视频在线| 久久丁香综合五月国产三级网站| 欧美日韩成人免费观看| 日韩大陆欧美高清视频区| 91福利精品在线观看| 日韩欧美视频免费在线观看| 99re成人在线| 中文字幕免费观看视频| 欧美激情国产精品| 国产日产一区| 欧美日韩一区二区区别是什么 | 亚洲成人黄色片| 欧美做爰性生交视频| 先锋资源久久| 青青草成人免费视频| 欧美性感一区二区三区| 日本理论片午伦夜理片在线观看| 久久久影院一区二区三区| 国内精品久久久久影院一蜜桃| 日产电影一区二区三区| 在线观看国产精品日韩av| 91国内精品白嫩初高生| 搡女人真爽免费午夜网站| 亚洲综合色噜噜狠狠| 国产在线观看精品一区| 国产免费一区二区| 精品亚洲成av人在线观看| 日韩av在线电影| 欧美猛交ⅹxxx乱大交视频| 国产影视精品一区二区三区|