我們正在開發阿拉伯語自然語言處理項目,我們限制了我們的選擇,要麼在Python或C++(和Boost庫)中編寫代碼。我們正在考慮這幾點:NLP項目,Python或C++
的Python
- 比C++慢(目前正在進行的工作,以使Python更快)
- 更好地支持UTF8
- 更快的書面測試和嘗試不同的算法
C++
- 更快比Python
- 熟悉的代碼,每個程序員都知道C或C類代碼
項目完成後,應該不是很難港口項目到另一個編程語言。
您認爲哪種方法更適合該項目?
我們正在開發阿拉伯語自然語言處理項目,我們限制了我們的選擇,要麼在Python或C++(和Boost庫)中編寫代碼。我們正在考慮這幾點:NLP項目,Python或C++
的Python
C++
項目完成後,應該不是很難港口項目到另一個編程語言。
您認爲哪種方法更適合該項目?
用Python編寫,分析它,如果你需要加快部分速度,用C++編寫它們。 Python和C++非常相似,C++的「熟悉」優勢將非常快速。
我說這是一個主要用C++開發的人,並且最近對Python很認真。我喜歡它們,但是我可以使Python代碼比C++工作得更快。真的,dict
擊敗std::map
的可用性。
用於算法開發和原型設計的python獲勝;如果需要的話,將計算密集的部分移動到c/C++模塊中很容易。 – James 2010-02-26 19:03:47
我已經這麼做了,C++有着驚人的執行時間,但是我們可能會忽略關於Python專業人員的這一點。 但你的想法真的很酷且務實。 – 2010-02-26 21:16:09
@ Kahled:那是我們的經驗。當然,我可以在C++中快速地使用FFT(使用fftw或MKL),但我的代碼中大於95%不是'fft()',這是決策制定,初始化和管理。而且,這是大部分時間都會改變的代碼,而不是內部循環的東西。當我在Python中完成這一部分時,我對它的應用程序的速度慢得多,但在實際應用中速度並不慢,而且開發速度要快得多。 – 2010-02-26 22:30:24
熟悉的代碼,每個程序員都知道C或C類代碼
許多開發者熟悉C或C類代碼,它並沒有使他們的C++標準。 未經驗的C++開發人員可能會對這樣一個複雜的項目造成很大的傷害,因此您必須格外小心。
我不能說python,但我聽說它對初學者更友好。
我想再說一次,你應該選擇你(作爲一個團隊)最熟悉的語言。
你的第一點非常有趣,但第二點對我們來說並不重要,因爲我們有兩種語言的很酷的程序員。 – 2010-02-26 21:34:21
雖然這是主觀的和論證性的,但有證據表明你可以用python編寫一個成功的NLP項目,如NLTK。他們也有一個comparison of NLP functionality in different languages:
(從比較報價)
很多編程語言已經使用了NLP。正如前言所述,我們選擇Python是因爲我們相信它非常適合NLP的特殊需求。在這裏,我們對幾種編程語言進行簡要的介紹,以便讀取文本和打印以ing結尾的單詞。我們開始與Python版本,我們認爲這是很容易解釋的,即使是非Python程序員:
import sys
for line in sys.stdin:
for word in line.split():
if word.endswith('ing'):
print word
[...]
C編程語言是一個高效率的低級語言是流行的操作系統和網絡軟件:
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
int i = 0;
int c = 1;
char buffer[1024];
while (c != EOF) {
c = fgetc(stdin);
if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
buffer[i++] = (char) c;
continue;
} else {
if (i > 2 && (strncmp(buffer+i-3, "ing", 3) == 0 || strncmp(buffer+i-3, "ING", 3) == 0)) {
buffer[i] = 0;
puts(buffer);
}
i = 0;
}
}
return 0;
}
編輯:我並沒有包括在C++ /升壓可比的代碼,所以我添加了一個代碼示例,做類似的事情,但不是我牙齒從Boost documentation。請注意,這不是最乾淨的版本。
// char_sep_example_1.cpp
#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>
int main()
{
std::string str = ";;Hello|world||-foo--bar;yow;baz|";
typedef boost::tokenizer<boost::char_separator<char> >
tokenizer;
boost::char_separator<char> sep("-;|");
tokenizer tokens(str, sep);
for (tokenizer::iterator tok_iter = tokens.begin();
tok_iter != tokens.end(); ++tok_iter)
std::cout << "<" << *tok_iter << "> ";
std::cout << "\n";
return EXIT_SUCCESS;
}
+1以上內容直接適用於該問題並提供其他信息。 – 2010-02-26 19:08:33
謝謝,這將是很好的知道誰-1ed我沒有評論雖然 – 2010-02-26 19:09:57
這個問題是關於蟒蛇和C + + /助推器,這個答案是關於python和C.你可以在這裏寫很多清潔器等效於 – 2010-02-26 19:16:29
這或多或少是對Otto Almendinger的回答/補充。如果你真的想要實現類似於C++他的Python的例子東西(大約),我覺得這樣的事情會比較接近:
#include <string>
#include <iostream>
int main() {
std::string temp;
while (std::cin>>temp)
if (temp.size()>2 && temp.substr(temp.size()-3, 3)=="ing")
std::cout << temp;
}
這本質上是做同樣的事情Python做,並且是約相同的長度,以及 - 在C++有更多的語法「雕蟲小技」,但他們有相同數量的代碼,真的做任何線(雖然毫無疑問的是,在C++版本的各條線更長)。
不要誤會我的意思:我當然不是要聲稱與C++,發展將是一樣快或容易與Python的。我認爲保證金可能會比這裏介紹的一些代碼小一些,但可能暗示了這一點。
編輯:如果您沒有要索賠C++會更快,更容易,你可以提出如下代碼:
for (std::string temp; std::cin>>temp;)
temp.size()>2 && temp.substr(temp.size()-3, 3)=="ing" && std::cout << temp;
...伴隨着一個事實準確的(雖然嚴重誤導性的)要求,如: 「C++代碼只有Python實現的一半多。」
IMO去C/C++的僅僅是因爲 '熟悉' 的因素。儘管LOC的C/C++版本將更多,但您可以節省時間進行理解和測試。
你應該考慮你點了Python自然語言工具包http://www.nltk.org/ – 2010-02-26 19:05:22
升壓缺乏統一的庫,因此,你應該考慮,而或Glibmm UTF-8字符串和字符轉換的其他實現,你應該選擇用C++來完成。儘管如此,您仍然可以找到Boost的其他工具(例如字符串算法)。 – Tronic 2010-02-26 19:57:42
@Dana理智:是的它是一個很好的點,但它太面向英語,也許我們可以添加一些功能集成到它,我們完成這個項目:) – 2010-02-26 21:31:02