自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python編程語(yǔ)言與Java的性能比較

開(kāi)發(fā) 后端
Python編程語(yǔ)言在實(shí)際的使用中會(huì)有不少人和其他的語(yǔ)言進(jìn)行比較。下面我們就向大家介紹下Python編程語(yǔ)言和Java之間的比較

Python編程語(yǔ)言目前的使用中需要不斷的學(xué)習(xí)。下面我們就詳細(xì)的看看如何才能更好的進(jìn)行相關(guān)知識(shí)的學(xué)習(xí)。最近我一直在看一個(gè)基于wxPython的GUI應(yīng)用程序代碼,大概45.5KLOC的左右,而且這還不包括它所用到的庫(kù)(如Twisted)。

代碼是由那些對(duì)Python比較生疏的Java的開(kāi)發(fā)者寫(xiě)的,所以它存在很?chē)?yán)重的性能問(wèn)題(如三十秒的啟動(dòng)時(shí)間)。在檢查代碼的時(shí)候,我發(fā)現(xiàn)他們寫(xiě)了很多在Java中能講得通但是對(duì)Python編程語(yǔ)言來(lái)說(shuō)去卻是很難接受的東西。并不是因?yàn)?ldquo;Python比Java慢”,而是因?yàn)樵赑ython中有更方便的方法去完成同樣的目標(biāo),甚至是在Java中不可能的事情。

所以,令人難過(guò)的事就是這些家伙事倍功半,寫(xiě)的那些代碼比本應(yīng)合乎用Python編程語(yǔ)言實(shí)現(xiàn)的慢很多。下面,讓我們來(lái)看一些例子:

◆Java中的靜態(tài)方法不能翻譯成Python的類方法。哦,當(dāng)然,他多多少少也能產(chǎn)生同樣的效果,但類方法的目的實(shí)際上是做一些通常在Java中甚至都不可能的事情(如繼承一個(gè)非默認(rèn)的默認(rèn)函數(shù))。Java靜態(tài)方法慣用的翻譯通常翻譯成一個(gè)模塊級(jí)的函數(shù),而不是一個(gè)類方法或靜態(tài)方法。(并且靜態(tài)常量應(yīng)該翻譯成模塊級(jí)常量.)
這不是性能上的問(wèn)題,但是一個(gè)Python編程語(yǔ)言程序員如果想調(diào)用Foo.someMethod,他要是被迫采用像Java中Foo.Foo.someMethod的方式去做的話,那么他就會(huì)被逼瘋的。有一點(diǎn)一定要注意:調(diào)用一個(gè)類方法需要一個(gè)額外的存儲(chǔ)空間,而調(diào)用靜態(tài)方法或函數(shù)就不需要這樣.

對(duì)了,還有就是這些Foo.Bar.Baz的屬性鏈也不是自己就能數(shù)出來(lái)的.在Java中,這些帶點(diǎn)的名稱是有編譯器來(lái)查找的,運(yùn)行的時(shí)候并不會(huì)去考慮一共有多少.而在Python中,查找的過(guò)程是在運(yùn)行時(shí)進(jìn)行的,所以要包括每個(gè)點(diǎn).(在Python中,要記住一點(diǎn),"平鋪的結(jié)構(gòu)別嵌套的要好",盡管相對(duì)于從性能方面來(lái)說(shuō),可能它更多涉及的是"可讀性"和"簡(jiǎn)單要比復(fù)雜好".)

◆要使用switch語(yǔ)句嗎?Python編程語(yǔ)言將是一個(gè)哈希表,不是一堆if-then語(yǔ)句。要使用在Java中不是switch語(yǔ)句而且還有字符串參與了的一堆if-then語(yǔ)句嗎?它將仍然是一個(gè)哈希表。CPython字典是用在我們所了解的領(lǐng)域中認(rèn)為是***性能之一的哈希表來(lái)實(shí)現(xiàn)的。你自己所寫(xiě)的代碼也不會(huì)比這個(gè)再好了,除非你是Guido、Tim Peters和Raymond Hettinger的私生子,而且還是遺傳增強(qiáng)了的。

◆XML不是答案。它也不是一個(gè)問(wèn)題?,F(xiàn)在用正則表達(dá)式來(lái)解釋Jamie Zawinski,“一些人,當(dāng)他遇到一個(gè)問(wèn)題的時(shí)候,就會(huì)想‘我知道,我要用XML.’那么他們就有兩個(gè)問(wèn)題了。”

相對(duì)于在Java中來(lái)說(shuō)這是個(gè)不同的情況,因?yàn)楸绕餔ava代碼,XML是靈活而且有彈性的。但比起Python的代碼來(lái),XML就是一個(gè)船錨,一個(gè)累贅。在Python中,XML是用來(lái)協(xié)同工作的,而不是你的核心功能,因?yàn)槟悴恍枰敲醋?。在Java中,XML可能是你的救世主,因?yàn)樗屇銓?shí)現(xiàn)了特定領(lǐng)域的語(yǔ)言并且“不用編碼”就提高你的應(yīng)用程序的適應(yīng)性。在Java中,避免編碼是一個(gè)很大的優(yōu)勢(shì),因?yàn)榫幋a意味著重新編譯。但在Python中,通常是,寫(xiě)代碼比寫(xiě)XML更簡(jiǎn)單。還有就是Python處理代碼要比處理XML快很多很多。(不僅僅是這個(gè),你必須寫(xiě)XML處理代碼,同時(shí)Python就已經(jīng)為你寫(xiě)好了.)

如果你是一個(gè)Java程序員,你并不能利用本能知覺(jué)來(lái)考慮你是否要在你的Python核心應(yīng)用中使用XML作為一部分。如果你不是因?yàn)樾畔⒔换サ脑蛉?shí)現(xiàn)一個(gè)已經(jīng)存在的XML標(biāo)準(zhǔn)或是建立某種輸入、輸出格式或者建立某種XML編輯器或處理工具,那么就不要這么做。根本不要去這么做。甚至連想都不要想?,F(xiàn)在,丟掉那個(gè)XML模式然后把你的手解放出來(lái)吧!如果你的應(yīng)用程序或者平臺(tái)要被Python編程語(yǔ)言開(kāi)發(fā)者使用,他們只會(huì)感謝你不要在他們的工作中添加使用XML的負(fù)擔(dān)。

(這里唯一的例外是如果你的客戶(your target audience)確確實(shí)實(shí)因?yàn)槟承┰蚨枰褂肵ML。就好像,他們拒絕學(xué)習(xí)Python但如果你使用XML他們就給你付錢(qián),或者你打算給他們一個(gè)很棒的能編輯XML的GUI,還有就是這個(gè)XML的GUI是另一個(gè)人寫(xiě)的,同時(shí)你得到免費(fèi)使用的權(quán)利。還有一些很少見(jiàn)的架構(gòu)上的原因需要用到XML。相信我,它們不會(huì)應(yīng)用到你的程序中去的。如果有疑問(wèn),對(duì)一個(gè)資深的Python開(kāi)發(fā)員解釋你的用例。或者,如果你臉皮厚而且不介意被人嘲笑的話,試試向一個(gè)Lisp程序解釋你的程序?yàn)槭裁匆肵ML!)

◆Getter和setter是惡魔。我應(yīng)該說(shuō)它是惡魔,是魔鬼!Python編程語(yǔ)言對(duì)象不是Java Bean。不要寫(xiě)什么getter和setter,而是還把它們內(nèi)置在“屬性”里面。它直到你能證明你需要比一個(gè)簡(jiǎn)單訪問(wèn)復(fù)雜一點(diǎn)的功能時(shí)才有意義,要不然,不要寫(xiě)getter和setter。它們是CPU時(shí)間的浪費(fèi),更要緊的是,它們還是程序員寶貴時(shí)間的浪費(fèi)。不僅僅對(duì)于寫(xiě)代碼和測(cè)試的人,對(duì)于那些要閱讀和理解它們的人也是。

在Java中,你必須使用getter和setter,因?yàn)楣沧侄尾辉试S你以后改變想法再去使用getter和setter。所以,在Java中你***事先避開(kāi)這些"家務(wù)雜事".在Python中,這樣做很傻,因?yàn)槟憧梢砸砸粋€(gè)普通特性開(kāi)始并可以在任何時(shí)間改變你的想法,而不用影響到這個(gè)類的任何客戶。所以不要寫(xiě)getter和setter方法。

◆代碼重復(fù)在Java中通常來(lái)說(shuō)就是一場(chǎng)不可避免的災(zāi)禍,你必須經(jīng)常反復(fù)地寫(xiě)同一個(gè)方法而只有一點(diǎn)點(diǎn)的變化(通常是這是因?yàn)殪o態(tài)類型約束)。在Python中這樣做是沒(méi)有必要的也是不值得的(除了極少數(shù)一些特定的場(chǎng)合需要內(nèi)聯(lián)一些要求性能的函數(shù))。如果你發(fā)現(xiàn)自己一遍一遍在寫(xiě)同樣的代碼而且變化很少,你就需要去學(xué)一下閉包。他們實(shí)際不并是那么可怕。#t#

這就是你要做的。你寫(xiě)了一個(gè)包含了函數(shù)的函數(shù)。這里內(nèi)部的函數(shù)就是你要一遍遍寫(xiě)的函數(shù)的模版,但是在里面加入了針對(duì)不同情況的函數(shù)要使用變量。外部的函數(shù)需要?jiǎng)倓偺岣叩哪欠N變量作為參數(shù),并且將內(nèi)部的函數(shù)作為結(jié)果返回。然后,每次你要寫(xiě)另一種略微不同的函數(shù)的時(shí)候,你只要調(diào)用這個(gè)外部的函數(shù),并且把返回值賦給你要讓“重復(fù)”函數(shù)出現(xiàn)的名字?,F(xiàn)在,如果你需要改變這個(gè)工作方式,你只需要改變一個(gè)地方:這個(gè)模版。

在我所看過(guò)的應(yīng)用程序/平臺(tái)中,只有一個(gè)很微不足道的程序使用了這個(gè)技術(shù),它去掉了數(shù)百行重負(fù)的代碼。實(shí)際上,因?yàn)殚_(kāi)發(fā)者使用了特別的樣板文件來(lái)為這個(gè)平臺(tái)開(kāi)發(fā)插件,所以這會(huì)節(jié)省很多很多第三方開(kāi)發(fā)人員的代碼,同時(shí)也使那些程序員要學(xué)習(xí)的東西變得簡(jiǎn)單了。

這只是Java->Python編程語(yǔ)言思維方式轉(zhuǎn)變的冰山一角而已,現(xiàn)在我能正確的轉(zhuǎn)變而不用去鉆研程序的細(xì)節(jié)。本質(zhì)上,如果你曾經(jīng)用過(guò)一段時(shí)間Java,而且對(duì)Python比較陌生,那么你不要太相信自己的本能。你的本能已經(jīng)被Java調(diào)節(jié),而不是Python。向后退一步來(lái)說(shuō),最重要的是不要再寫(xiě)這么多代碼了。

為了這樣做,讓自己覺(jué)得更加需要Python。假裝好像Python是可以做任何你想做的魔棒,而你無(wú)須出一點(diǎn)力。問(wèn)一下,“Python怎樣解決我的問(wèn)題?”還有“Python語(yǔ)言的哪個(gè)特點(diǎn)和我的問(wèn)題最相似?”如果對(duì)于你需要的東西其實(shí)已經(jīng)有了某種固定形式,那么你絕對(duì)會(huì)感到驚訝的。事實(shí)上,這種現(xiàn)象實(shí)在是太普遍了,甚至即使在很有經(jīng)驗(yàn)的Python程序員中也會(huì)出現(xiàn),以至于Python社區(qū)中給這種現(xiàn)象起了個(gè)名字。我們稱之為“GUIDO的時(shí)間機(jī)器”,因?yàn)樵谖覀冏约哼€沒(méi)有掌握它之前,通??瓷先ヒ玫轿覀兯枰臇|西好像那是唯一的方法。

所以,如果你在使用Python編程語(yǔ)言時(shí)候不能感到比使用Java要至少多出10倍的生產(chǎn)力話,你就***做一下改動(dòng),你是不是忘記使用time machine!(chances are good that you've been forgetting to use the time machine)(同時(shí)如果你還懷念你的Java IDE,你可以這樣想:因?yàn)槟銓?xiě)的Python程序比他所需要的要復(fù)雜得多.)

責(zé)任編輯:張浩 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2010-03-11 10:51:19

Python編程語(yǔ)言

2020-07-27 08:24:42

編程語(yǔ)言C語(yǔ)言Java

2009-05-25 08:39:08

iPhone蘋(píng)果移動(dòng)OS

2023-11-20 10:34:09

語(yǔ)言

2011-04-15 10:26:38

JavaMVC

2009-07-01 18:12:18

JSP的優(yōu)勢(shì)性能比較

2011-07-06 14:18:40

Percona SerMySQL

2009-12-04 19:28:25

FreeBSD 8.0Ubuntu 9.10性能比較

2010-03-10 19:46:07

Python編程語(yǔ)言

2013-04-03 10:04:36

MySQL 5.6

2023-12-11 08:39:14

Go語(yǔ)言字符串拼

2013-12-16 10:20:48

MySQL數(shù)據(jù)庫(kù)

2012-12-03 10:26:51

Scala

2011-05-18 14:52:04

XML

2019-07-29 09:19:26

編程語(yǔ)言PythonJava

2015-02-05 09:25:51

HTTPSSPDYHTTP2

2010-05-31 15:35:33

2023-11-19 21:17:58

GoRust

2010-12-27 16:01:45

jQuery選擇器

2009-12-16 14:10:12

路由技術(shù)性能比較
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)