<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

    CowNew開源團(tuán)隊(duì)

    http://www.cownew.com 郵件請(qǐng)聯(lián)系 about521 at 163.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評(píng)論 :: 0 Trackbacks

    作者:Phillip J. Eby.
    翻譯:ShiningRay @ NirvanaStudio
    原文地址:[[http://dirtsimple.org/2004/12/python-is-not-java.html][1]][1]

    我最近正在看一個(gè)基于wxPython的GUI應(yīng)用程序,大概45.5KLOC的樣子,但我沒有計(jì)算它用到的庫的大小(如Twisted)。代碼是由那些對(duì)Python相對(duì)生疏的Java的開發(fā)者寫的,所以程序有很嚴(yán)重的性能問題(如三十秒的啟動(dòng)時(shí)間)。我在檢查代碼的時(shí)候發(fā)現(xiàn)他們寫了很多對(duì)Java有意義但是對(duì)Python卻很恐怖的東西。并不是因?yàn)椤癙ython比Java慢”,而是因?yàn)樵赑ython中有更方便的方法去完成同樣的目標(biāo),甚至在Java中不可能的事情。

    所以,可悲的事就是這些可憐人事倍功半,產(chǎn)生了很多很多不需要寫的代碼,從而比相應(yīng)合乎Python習(xí)慣的寫法慢得多得多。我們來看一些例子:

    * 在Java中一個(gè)靜態(tài)的方法(static)不能翻譯成一個(gè)Python的類方法(classmethod)。哦,當(dāng)然,多多少少他最終產(chǎn)生類似的效果,但類方法的目的實(shí)際上是做了一些通常在Java中不可能的事(如繼承一個(gè)非默認(rèn)的構(gòu)造函數(shù))。Java靜態(tài)方法的習(xí)慣翻譯通常是一個(gè)模塊級(jí)函數(shù),而不是一個(gè)類方法或靜態(tài)方法(staticmetho)。(同時(shí)靜態(tài)封閉(final)字段應(yīng)該翻譯成模塊級(jí)常量。)

    這并不是一個(gè)性能上的問題,但是一個(gè)Python程序員要用像這些類似Java習(xí)慣的代碼的話,可能就會(huì)被在該輸入Foo.someFunction時(shí)卻要輸入Foo.Foo.someMethod這種情況給惹毛了。但是請(qǐng)注意:調(diào)用一個(gè)類方法將會(huì)比調(diào)用一個(gè)靜態(tài)方法和函數(shù)要多一部分額外的內(nèi)存。

    啊,那些Foo.Bar.Baz也不是省油的。在Java中,這些點(diǎn)分割的名稱是由編譯器去查找的,所以運(yùn)行時(shí)根本無所謂你有多少點(diǎn)。在Python中,每次運(yùn)行時(shí)都要查找,所以每個(gè)點(diǎn)都要計(jì)算在內(nèi)。(Python中一定要記住這點(diǎn),“平鋪比嵌套好”,盡管比起性能,他和“可讀性”和“簡(jiǎn)單就是美”更靠近。)

    * 要用switch語句?Python翻譯將是一個(gè)哈希表,不是一堆if-then語句。用一堆if-then在Java中也不是switch語句,如果有字符串參與了呢?他其實(shí)是一個(gè)哈希表。CPython字典實(shí)現(xiàn)用了性能最佳??在我們宇宙中目前所知道的?的哈希表的實(shí)現(xiàn)之一。你自己所寫的代碼也不會(huì)比這個(gè)再好了,除非你是Guido、Tim Peters和Raymond Hettinger的關(guān)門弟子。

    * XML不是答案。它也不是一個(gè)問題。要在正則表達(dá)式上解釋Jamie Zawinski,“一些人,當(dāng)遇到一個(gè)問題的時(shí)候,就想‘我知道,我要用XML’那這個(gè)時(shí)候,他們就有兩個(gè)問題了。”

    和Java比這個(gè)一個(gè)不同的情況,因?yàn)楸绕餔ava代碼,XML是輕巧而且有彈性的。但比起Python的代碼來,XML就是一個(gè)船錨,一個(gè)絆腳石。在Python中,XML是用來做交換,而不是你的核心功能,因?yàn)槟悴恍枰@么做。在Java中,XML可能是你的大救星因?yàn)樗屇銓?shí)現(xiàn)了特定領(lǐng)域的語言并“不通過編碼”提高了你的應(yīng)用程序的適應(yīng)性。在Java中,避免編碼是一個(gè)很大的優(yōu)勢(shì),因?yàn)榫幋a意味著重新編譯。但在Python中,更常見的是,寫代碼比寫XML更方便簡(jiǎn)單。同時(shí)Python處理代碼要遠(yuǎn)遠(yuǎn)比處理XML快。(不僅僅是這個(gè),你必須書XML處理代碼,同時(shí)Python自身就已經(jīng)為你準(zhǔn)備好了。)

    如果你是一個(gè)Java程序員,對(duì)于你是否要在你的Python核心應(yīng)用中使用XML作為一部分,不要相信你的本能。如果你不是因?yàn)樾畔⒔换サ脑蛉?shí)現(xiàn)一個(gè)已經(jīng)存在的XML標(biāo)準(zhǔn)或是建立某種導(dǎo)入、導(dǎo)出格式或者建立某種XML編輯器或處理工具,那么就不要這么做。一次也別。甚至連想都不要想。現(xiàn)在,扔掉那個(gè)XML模式把你的手解放吧!如果你的應(yīng)用程序或者平臺(tái)要被Python開發(fā)者使用,他們只會(huì)感謝你不要在他們的工作量中添加使用XML的負(fù)擔(dān)。

    (這里唯一的例外是如果你的受眾的的確確,確確實(shí)實(shí)需要XML,出于某種奇怪的理由。像,他們拒絕學(xué)習(xí)Python并只對(duì)你使用了XML而付錢給你,或者你打算給他們一個(gè)編輯XML的GUI,同時(shí)這個(gè)寫XML的GUI呢是另一個(gè)人寫的,同時(shí)你得到免費(fèi)使用的權(quán)利。還有一些很少見的架構(gòu)上的原因需要用到XML。相信我,他們不會(huì)出現(xiàn)在你的程序中。如果有疑問,對(duì)一個(gè)資深的Python開發(fā)員解釋你的用例。或者,如果你臉皮厚的話,試試向一個(gè)Lisp程序解釋你的程序?yàn)槭裁匆肵ML!)

    * Getter和Setter是壞蛋!壞蛋!魔鬼! Python對(duì)象不是Java Bean。不要寫什么getter和setter,然后還把它們包裝在“屬性”里面。它直到你能證明你需要比一個(gè)簡(jiǎn)單訪問復(fù)雜一點(diǎn)的功能時(shí)才有意義,否則,不要寫getter和setter。它們是CPU時(shí)間的浪費(fèi),更要緊的是,它們還是程序員寶貴時(shí)間的極大浪費(fèi)。不僅僅對(duì)于寫代碼和測(cè)試的人,對(duì)于那些要閱讀和理解它們的人也是。

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

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

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

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

    這只是Java->Python思維方式轉(zhuǎn)變的冰山一角而已,現(xiàn)在我可以讓他轉(zhuǎn)變成正確的而不用鉆研這個(gè)程序的細(xì)節(jié)。本質(zhì)上,如果你曾經(jīng)用過一段時(shí)間Java,而且對(duì)Python比較陌生,不要太相信自己的本能。你的本能已經(jīng)為Java調(diào)節(jié),而不是Python。向后退一步,最重要的,不要寫這么多代碼了。

    要這樣做,讓自己覺得更加需要Python。假裝好像Python是可以做任何你想做的魔棒,卻讓你無須動(dòng)一個(gè)手指。問一下,“Python是怎樣解決我的問題的?”還有“Python語言的哪個(gè)特點(diǎn)和我的問題最相似?”你絕對(duì)會(huì)驚訝于你需要的東西其實(shí)已經(jīng)有了某種固定形式。事實(shí)上,這種現(xiàn)象實(shí)在是太普遍了,甚至在很有經(jīng)驗(yàn)的Python程序員中也會(huì)出現(xiàn),以至于Python社區(qū)中給這種現(xiàn)象起了個(gè)名字。我們稱之為“GUIDO的時(shí)間機(jī)器”(GUIDO是美語中太空飛行工程師的意思),因?yàn)橛袝r(shí)候看上去得到我們所需要的東西好像只有他知道的一種方法,但當(dāng)我們自己知道了就不一樣了。

    所以,如果你不能感到你在使用Python時(shí)至少比用Java要多出10倍的生產(chǎn)力,!(同時(shí)如果你還懷念你的Java IDE,考慮一下這種可能性:因?yàn)槟銓懙腜ython程序比他所需要的要復(fù)雜得多)


    附錄:(翻譯自此篇文章的評(píng)論)

    確實(shí),哈希表==字典。舉個(gè)最簡(jiǎn)單的例子,從Python標(biāo)準(zhǔn)庫中檢出“pickle”和“copy”模塊,這兩個(gè)模塊會(huì)從字典中查找類型并調(diào)用相應(yīng)的函數(shù)。另一個(gè)有些詭異的例子是范型函數(shù),我已經(jīng)在最近的Blog中寫了一下。

    關(guān)于閉包的例子,我這里給出一個(gè)很笨的資歷。假設(shè)你要寫很多這樣的函數(shù):

    def addOne(x): return x+1
    def addTwo(x): return x+2

    然后你可以這樣寫:

    def makeAdder(addend):
    ... def add_it(x): return x+addend
    ... return add_it

    并且這樣使用:

    addOne = makeAdder(1)
    addTwo = makeAdder(2)

    這樣就可以等同于原來的定義了。

    [1]: [http://dirtsimple.org/2004/12/python-is-not-java.html][2]
    [1]: http://dirtsimple.org/2004/12/python-is-not-java.html][1]
    [2]: http://dirtsimple.org/2004/12/python-is-not-java.html

    posted on 2007-03-02 12:29 CowNew開源團(tuán)隊(duì) 閱讀(370) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 在线看片免费不卡人成视频| 99久久99这里只有免费费精品| 日韩免费高清一级毛片在线| 亚洲综合久久精品无码色欲| 搡女人免费视频大全| 亚洲AV电影天堂男人的天堂| 国产成人精品免费视频大全五级| 美女被艹免费视频| 久久久久亚洲AV综合波多野结衣 | 男人j进入女人j内部免费网站| 久久精品国产精品亚洲人人| 在线免费视频你懂的| 亚洲AV无码专区电影在线观看 | 无码人妻一区二区三区免费| 涩涩色中文综合亚洲| 四虎永久精品免费观看| 九九综合VA免费看| 亚洲熟妇av一区二区三区漫画| 光棍天堂免费手机观看在线观看| 亚洲狠狠综合久久| 成人黄动漫画免费网站视频 | 一级做性色a爰片久久毛片免费| 久久亚洲国产成人影院网站| 免费一区二区无码东京热| 中文字幕亚洲综合精品一区| 三年片在线观看免费大全| WWW国产亚洲精品久久麻豆| 亚洲中文字幕在线乱码| 19禁啪啪无遮挡免费网站| 亚洲一本一道一区二区三区| 亚洲AV无码一区二区三区国产| 精品在线免费观看| 亚洲香蕉在线观看| 亚洲精品黄色视频在线观看免费资源 | 亚洲国产精品无码观看久久| 中文字幕人成人乱码亚洲电影 | 日本免费一区二区三区 | 中文字幕成人免费高清在线| 亚洲成aⅴ人在线观看| 亚洲 小说区 图片区 都市| 67194成手机免费观看|