Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
發(fā)于:https://studygolang.com/articles/14132
如果你在使用像 C# 或 Java 這樣的編程語(yǔ)言后來(lái)到 go,你發(fā)現(xiàn)的第一件事就是沒(méi)有像 List和 Dictionary 這樣的傳統(tǒng)集合類型。 這真讓我困惑了好幾個(gè)月。 我找到了一個(gè)名為container/list 的軟件包,并且?guī)缀跤盟鏊械臇|西。
我腦后一直有一個(gè)聲音在嘮叨。語(yǔ)言設(shè)計(jì)者不應(yīng)該不直接支持對(duì)未知長(zhǎng)度的集合管理的功能。每個(gè)人都在討論切片是如何在語(yǔ)言中被廣泛使用,但我只是在有明確定義的容量或者它們通過(guò)函數(shù)返回時(shí)我才使用切片,這有點(diǎn)不對(duì)勁!!
因此,我在本月早些時(shí)候?qū)懥艘黄恼拢议_(kāi)了切片的蓋子,希望能找到一些我不知道的魔法。我現(xiàn)在知道切片是如何工作的,但最終我仍然需要一個(gè)不斷進(jìn)行長(zhǎng)度增長(zhǎng)的數(shù)組。我在學(xué)校學(xué)過(guò),使用鏈表更有效率,是存儲(chǔ)大量數(shù)據(jù)更好的方法。特別是當(dāng)你需要的集合長(zhǎng)度未知時(shí)。這對(duì)我來(lái)說(shuō)很有意義。
當(dāng)我思考使用一個(gè)空切片時(shí),我頭腦中有一張非常錯(cuò)誤的圖片:
slice-copy
我一直在想 go 是如何創(chuàng)建大量新的切片值和底層數(shù)組做大量?jī)?nèi)存分配,并且不斷進(jìn)行復(fù)制值。然后垃圾回收器會(huì)因?yàn)樗羞@些小變量被創(chuàng)建和銷毀而過(guò)度工作。
我無(wú)法想象需要做數(shù)千次這種操作。其實(shí)有更好的方法或更效率的方式我沒(méi)有意識(shí)到。
在研究并提出了很多問(wèn)題之后,我得出的結(jié)論是,在大多數(shù)實(shí)際情況下,使用切片比使用鏈表更好。這就是為什么語(yǔ)言設(shè)計(jì)者花時(shí)間使切片盡可能高效工作,并且沒(méi)有引入集合類型的原因。
我們可以連續(xù)幾天討論各種邊界情況和性能問(wèn)題,但 go 希望我們使用切片。因此切片應(yīng)該是我們的首選,除非代碼告訴我們存在問(wèn)題。掌握切片就像學(xué)國(guó)際象棋游戲,易于學(xué)習(xí)但需要一輩子才能成為大師。因?yàn)榈讓訑?shù)組可以共享,所以在使用中需要注意一些問(wèn)題。
在繼續(xù)閱讀之前,你最好看一下我的另一篇文章 Understanding Slices in Go Programming。
本文的其余部分將解釋如何使用切片處理未知容量的問(wèn)題以及切片的運(yùn)行機(jī)制。
以下是使用空切片來(lái)管理未知長(zhǎng)度集合的示例:
1package main 2 3import ( 4 "fmt" 5 "math/rand" 6 "time" 7) 8 9type Record struct { 10 ID int 11 Name string 12 Color string 13} 14 15func main() { 16 // Let’s keep things unknown 17 random :=rand.New(rand.NewSource(time.Now().Unix())) 18 19 // Create a large slice pretending we retrieved data 20 // from a database 21 data :=make([]Record, 1000) 22 23 // Create the data set 24 for record :=0; record < 1000; record++ { 25 pick :=random.Intn(10) 26 color :="Red" 27 28 if pick==2 { 29 color="Blue" 30 } 31 32 data[record]=Record{ 33 ID: record, 34 Name: fmt.Sprintf("Rec: %d", record), 35 Color: color, 36 } 37 } 38 39 // Split the records by color 40 var red []Record 41 var blue []Record 42 43 for _, record :=range data { 44 if record.Color=="Red" { 45 red=append(red, record) 46 } else { 47 blue=append(blue, record) 48 } 49 } 50 51 // Display the counts 52 fmt.Printf("Red[%d] Blue[%d]\n", len(red), len(blue)) 53}
當(dāng)我們運(yùn)行這個(gè)程序時(shí),由于隨機(jī)數(shù)生成器,我們將得到不同長(zhǎng)度的紅色和藍(lán)色切片。我們無(wú)法提前知道紅色或藍(lán)色切片的容量需要,這對(duì)我來(lái)說(shuō)是一種典型的情況。
讓我們分解出代碼中更重要的部分:
這兩行代碼創(chuàng)建了空切片。
1var red []Record 2var blue []Record
一個(gè)空切片長(zhǎng)度和容量都是0,并且不存在底層數(shù)組。我們可以使用內(nèi)置的 append 函數(shù)向切片中增加數(shù)據(jù)。
1red=append(red, record) 2blue=append(blue, record)
append 函數(shù)功能非常酷,為我們做了很多東西。
Kevin Gillette 在我的小組討論中進(jìn)行了說(shuō)明:
(https://groups.google.com/forum/#!topic/golang-nuts/nXYuMX55b6c)
在 go 語(yǔ)音規(guī)范中規(guī)定,前幾千個(gè)元素在容量增長(zhǎng)的時(shí)候每次都將容量翻倍,然后以~1.25的速率進(jìn)行容量增長(zhǎng)。
我不是學(xué)者,但我看到使用波浪號(hào)(~)相當(dāng)多。有些人也許不知道這是什么意思,這里表示大約。因此,append 函數(shù)會(huì)增加底層數(shù)組的容量并為未來(lái)的增長(zhǎng)預(yù)留空間。最終 append 函數(shù)將大約以1.25或25%的系數(shù)進(jìn)行容量增長(zhǎng)。
讓我們證明 append 函數(shù)增長(zhǎng)容量并高效運(yùn)行:
1package main 2 3import ( 4 "fmt" 5 "reflect" 6 "unsafe" 7) 8 9func main() { 10 var data []string 11 12 for record :=0; record < 1050; record++ { 13 data=append(data, fmt.Sprintf("Rec: %d", record)) 14 15 if record < 10 || record==256 || record==512 || record==1024 { 16 sliceHeader :=(*reflect.SliceHeader)((unsafe.Pointer(&data))) 17 18 fmt.Printf("Index[%d] Len[%d] Cap[%d]\n", 19 record, 20 sliceHeader.Len, 21 sliceHeader.Cap) 22 } 23 } 24}
輸出結(jié)果:
1Index[0] Len[1] Cap[1] 2Index[1] Len[2] Cap[2] 3Index[2] Len[3] Cap[4] - Ran Out Of Room, Double Capacity 4Index[3] Len[4] Cap[4] 5Index[4] Len[5] Cap[8] - Ran Out Of Room, Double Capacity 6Index[5] Len[6] Cap[8] 7Index[6] Len[7] Cap[8] 8Index[7] Len[8] Cap[8] 9Index[8] Len[9] Cap[16] - Ran Out Of Room, Double Capacity 10Index[9] Len[10] Cap[16] 11Index[256] Len[257] Cap[512] - Ran Out Of Room, Double Capacity 12Index[512] Len[513] Cap[1024] - Ran Out Of Room, Double Capacity 13Index[1024] Len[1025] Cap[1280] - Ran Out Of Room, Grow by a factor of 1.25
如果我們觀察容量值,我們可以看到 Kevin 是絕對(duì)正確的。容量正如他所說(shuō)的那樣在增長(zhǎng)。在前1千的元素中,容量增加了一倍。然后容量以1.25或25%的系數(shù)增長(zhǎng)。這意味著以這種方式使用切片將滿足我們?cè)诖蠖鄶?shù)情況下所需的性能,并且內(nèi)存不會(huì)成為問(wèn)題。
最初我認(rèn)為會(huì)為每次調(diào)用 append 時(shí)都會(huì)創(chuàng)建一個(gè)新的切片值,但事實(shí)并非如此。當(dāng)我們調(diào)用append 時(shí),在棧中復(fù)制了 red 副本。然后當(dāng) append 返回時(shí),會(huì)再進(jìn)行一次復(fù)制操作,但使用的我們已有的內(nèi)存。
1red=append(red, record)
在這種情況下,垃圾收集器沒(méi)有工作,所以我們根本沒(méi)有性能或內(nèi)存問(wèn)題。我的 C# 和引用類型的思想再次打擊了我。
請(qǐng)坐好,因?yàn)橄乱粋€(gè)版本中的切片會(huì)有變化。
Dominik Honnef 創(chuàng)建了一個(gè)博客,用簡(jiǎn)明的英文(謝謝)解釋了 Go tip 中正在編寫的內(nèi)容。這些是下一版本中的內(nèi)容。這是他博客的和博客中關(guān)于切片部分的鏈接。這是一篇很棒博客,推薦閱讀。
http://dominik.honnef.co/go-tip/
http://dominik.honnef.co/go-tip/2013-08-23/#slicing
你可以用切片做很多的事情,甚至可以寫一整本關(guān)于這個(gè)主題的書。就像我之前說(shuō)的那樣,切片就像國(guó)際象棋一樣,易于學(xué)習(xí)但需要一輩子才能成為大師。如果您來(lái)自其他語(yǔ)言,如 C# 和 Java,那么請(qǐng)擁抱切片并使用它。這正是 go 中正確的方式。
via:https://www.ardanlabs.com/blog/2013/08/collections-of-unknown-length-in-go.html
作者:William Kennedy
譯者:Alan
校對(duì):polaris1119
本文由 GCTT 原創(chuàng)編譯,Go 中文網(wǎng) 榮譽(yù)推出
愛(ài)好堅(jiān)持,以收藏說(shuō)事,學(xué)棋齋主是認(rèn)真的!
#中國(guó)象棋#
棋家王首成
王首成,男,1970年7月6日出生黑龍江,象棋圖書作家。癡迷江湖排局,曾對(duì)江湖排局投入了十余年的研究工作,尤其對(duì)“征西”局有著深入細(xì)致的研討。2005年在哈爾濱市,結(jié)識(shí)了慕名已久的著名的象棋排局家李中健老師,從此步入排局界。2010年開(kāi)始出版了十幾部象棋排局書籍。
本人收藏了王先生的兩部作品《街頭棋攤揭秘》、《江湖排局新作》和電子版《百花齊放象棋譜》。
《百花齊放象棋譜》
電子版《百花齊放象棋譜》
江湖棋局的江湖
江湖棋局也是有江湖的。比如幾大名譜棋局就是異同互見(jiàn)的,可惜少有人梳捋其來(lái)龍去脈。在現(xiàn)代隨著江湖棋攤發(fā)展、棋家的創(chuàng)新、在古譜的基礎(chǔ)上,不斷出現(xiàn)了更多的新作,他們和古譜的源流、隨時(shí)間的變遷,棋家的努力等等,值得愛(ài)好者關(guān)注和學(xué)習(xí)研究。
王首成先生的《街頭棋攤揭秘》、《江湖排局新作》,正是這方面研究的成果集成,真是“首成”,也說(shuō)不定,我不敢妄斷!
江湖排局源出江湖,是經(jīng)過(guò)多少江湖藝人精心提煉的結(jié)晶。江湖棋攤是江湖藝人每天設(shè)局謀生之處,隨著社會(huì)的發(fā)展進(jìn)步,江湖棋攤也隨之進(jìn)行了日新月異的改革和創(chuàng)新。復(fù)雜深?yuàn)W、變幻莫測(cè)的江湖大局如七星聚會(huì)、野馬操田等已少見(jiàn),關(guān)鍵是每天所選用的江湖排局要有好而多的陷阱,才可以使挑戰(zhàn)者在每一局棋上多下幾局。
同時(shí),一局棋局的同類局更多了,其中一個(gè)卒位置稍有差異,可能過(guò)程和結(jié)果,大相徑庭。攤主復(fù)原棋局時(shí)你稍微沒(méi)注意,可能就不是上一局面了。
這兩本書,共收錄新舊排局274局。在寫法上分“江湖揭秘”、“棋局介紹”、“類局拾萃”、“名手介紹(江湖排局新作主要介紹了1949年前的國(guó)手)”四個(gè)部分。非常具有可讀性和藝術(shù)性。
送炮成和局
賽事: 天天象棋網(wǎng)頁(yè)(H5)版送炮成和局
日期: 2022-05-31
紅方: 木狐齋主
黑方應(yīng)該是有贏棋機(jī)會(huì)的,此著馬7進(jìn)5,大誤,紅方送炮妙手,結(jié)果和棋。
1. 馬7進(jìn)5 炮一平五
應(yīng)該炮5進(jìn)7?成馬炮士象全對(duì)炮雙高兵,顯然黑好走。
2. 炮5進(jìn)3 帥五進(jìn)一
紅方應(yīng)對(duì)無(wú)誤,結(jié)果破雙士成和。經(jīng)查,炮士象全也是贏不了雙高兵的吧?請(qǐng)高手指教!
有指教,請(qǐng)留言,學(xué)習(xí)!
出處 | 量子位
推薦 | 編程派公眾號(hào)(ID:codingpy)
GPT-2,一個(gè)來(lái)自O(shè)penAI的逆天語(yǔ)言模型,現(xiàn)在能用來(lái)補(bǔ)全代碼了。
一位來(lái)自加拿大的大四學(xué)霸,開(kāi)發(fā)了一款”Deep TabNine“代碼補(bǔ)全工具,實(shí)現(xiàn)了這一大膽的想法。
它支持23種編程語(yǔ)言、5種編輯器,使用簡(jiǎn)單,效果驚艷。
不少使用過(guò)的網(wǎng)友說(shuō):TabNine是他們用過(guò)的最好的代碼補(bǔ)全工具,這是屬于程序員的殺手級(jí)應(yīng)用。
在VS Code的擴(kuò)展商店里,TabNine已經(jīng)被下載1.3萬(wàn)次,獲得全5星好評(píng)。
Deep TabNine支持Java:
Python:
C++:
Haskell:
不同于各種其他代碼補(bǔ)全插件,Deep TabNine是根據(jù)程序員過(guò)去的習(xí)慣自動(dòng)補(bǔ)全,并在后面給出幾種選項(xiàng)的概率。
如果有類似代碼出現(xiàn)在之前的項(xiàng)目里,TabNine還會(huì)在補(bǔ)全候選框中直接給出地址,方便用戶點(diǎn)擊進(jìn)去查閱。
除以上幾種語(yǔ)言之外,Deep TabNine還支持JavaScript、C、PHP、Go、C#、Ruby、Objective-C、Rust、Swift、TypeScript、OCaml、Scala、Kotlin、Perl、SQL、HTML、CSS和Bash。
主流編程語(yǔ)言幾乎都囊括在內(nèi)。
TabNine支持VS Code、Sublime Text、Atom、Emacs、Vim五種代碼編輯器。
對(duì)于使用VS Code和Sublime來(lái)說(shuō),安裝TabNine非常方便,用自帶的擴(kuò)展包管理工具即可。
VS Code用戶按下Ctrl+P(Mac用戶按下?+P),粘貼以下命令,然后按回車鍵完成安裝。
ext install TabNine.tabnine-vscode
Sublime用戶安裝分為兩步:
1、按下Ctrl+Shift+P(Mac用戶:?+Shift+P),選擇Install Package Control;
2、再次按下Ctrl+Shift+P(Mac用戶:?+Shift+P),選擇Package Control:Install Package,然后選擇TabNine來(lái)安裝。
Vim使用Vundle插件管理器進(jìn)行安裝:
1、添加Plugin ‘zxqfl/tabnine-vim’到.vimrc;
2、輸入:PluginInstall,按下回車完成安裝。
其他編輯器的安裝方法就不一一贅述了,有需要的用戶可以參照文末的鏈接進(jìn)行安裝。
項(xiàng)目超過(guò)400kb需要購(gòu)買許可證:個(gè)人用戶49美元,商業(yè)用戶99美元。
由于Deep TabNine用到機(jī)器學(xué)習(xí)補(bǔ)全代碼,因此需要大量的算力(超過(guò)100億次浮點(diǎn)運(yùn)算),在筆記本上運(yùn)行模型,無(wú)法獲得低延遲的體驗(yàn)。
因此,軟件開(kāi)發(fā)者推出了TabNine Cloud云服務(wù)器,用云端GPU加速。付費(fèi)用戶不需要再加錢即可使用。
所以聽(tīng)起來(lái)很劃算吧?
軟件開(kāi)發(fā)者自己就說(shuō),這個(gè)價(jià)格其實(shí)不貴,有了TabNine,一分鐘就里能幫你節(jié)省一秒,咱們?cè)偎闼愠绦騿T的時(shí)薪,每個(gè)小時(shí)能節(jié)約1.4美元,不到一年時(shí)間就能回本了。
如果你對(duì)效果不滿意,TabNine開(kāi)發(fā)者還提供30天退款保證。
TabNine是在GPT-2的基礎(chǔ)上構(gòu)建的,這是一種Transformer架構(gòu),原產(chǎn)自O(shè)penAI,是個(gè)“逆天”語(yǔ)言模型。
GPT-2的參數(shù)高達(dá)15億個(gè),數(shù)據(jù)量比一代擴(kuò)大了10倍,使用了包含800萬(wàn)個(gè)網(wǎng)頁(yè)的數(shù)據(jù)集,共有40GB。
逆天之處就在于,GPT-2寫起文章來(lái)毫無(wú)違和感,無(wú)需針對(duì)性訓(xùn)練就能橫掃各種特定領(lǐng)域的語(yǔ)言建模任務(wù),還具備閱讀理解、問(wèn)答、生成文章摘要、翻譯等等能力。
就GPT-2而言,它的訓(xùn)練目標(biāo)很簡(jiǎn)單:根據(jù)所有給定文本中前面的單詞,預(yù)測(cè)下一個(gè)單詞。雖然本來(lái)是解決NLP問(wèn)題,看似與寫代碼沒(méi)什么關(guān)聯(lián),但建模代碼也算是用一種獨(dú)有的方式在理解英文。
比如,可以讓模型用if/else語(yǔ)句否定單詞:
項(xiàng)目主頁(yè)顯示,在大約經(jīng)過(guò)GitHub中200萬(wàn)個(gè)文件訓(xùn)練后,TabNine具備了自動(dòng)補(bǔ)全代碼的能力。
在訓(xùn)練這個(gè)模型期間,模型學(xué)習(xí)了例如動(dòng)態(tài)類型語(yǔ)言中的類型推斷等復(fù)雜行為,用這樣的訓(xùn)練方式預(yù)測(cè)token。
作者表示,TabNine可以很好利用傳統(tǒng)代碼補(bǔ)全工具難以獲取的瑣碎細(xì)節(jié)。
例如,假設(shè)app.get_user的返回類型是一個(gè)帶有setter方法的對(duì)象,而app.get_users的返回類型是一個(gè)列表,兩個(gè)名稱之間只有細(xì)微的差別:
這個(gè)模型還能以自然語(yǔ)言編寫的文檔來(lái)推斷函數(shù)名稱、參數(shù)和返回類型:
Deep TabNine加入了之前用戶強(qiáng)烈要求加入的功能:用預(yù)先存在的知識(shí),解決在創(chuàng)建新項(xiàng)目時(shí)的代碼補(bǔ)全問(wèn)題。
例如,它知道當(dāng)一個(gè)類擴(kuò)展React.Component時(shí),它的構(gòu)造函數(shù)通常會(huì)調(diào)用一個(gè)名為props的參數(shù),并且通常在其內(nèi)部用this.state賦值:
Deep TabNine甚至可以做不可能的事情,并記住C++可變參數(shù)轉(zhuǎn)發(fā)語(yǔ)法:
TabNine問(wèn)世后,不斷收獲好評(píng),甚至還有程序員激動(dòng)得爆粗口:
臥槽,這種軟件多來(lái)點(diǎn)就好了。(Fuck yeah. This is the sort of software I want to see more often: TabNine )
有網(wǎng)友表示, 沒(méi)有它都不知道該怎么面對(duì)寫代碼這件事了。
還有人稱之為開(kāi)發(fā)者應(yīng)用中的第一個(gè)“殺手級(jí)應(yīng)用程序”:
“令人印象深刻”、“感到神奇”“太酷了”……推特上的評(píng)價(jià),頗有電視廣告上“用了都說(shuō)好”的畫風(fēng)。
在各大科技論壇上,也有網(wǎng)友提出了建議和改進(jìn)的方向。
有用戶反映,也有美中不足的地方,比如這個(gè)工具會(huì)干擾自動(dòng)括號(hào)完成。
作者表示,TabNine還在不斷更新完善中,正在改進(jìn)這些bug。
想不到吧,這款好評(píng)如潮的代碼工具,出自一名大四學(xué)生之手。
Jacob Jackson,加拿大人,目前在滑鐵盧大學(xué)主修計(jì)算機(jī)科學(xué)與組合優(yōu)化專業(yè),輔修數(shù)學(xué)。大四在讀,今年8月份畢業(yè)。
Jackson此前在Reddit上發(fā)帖稱,這是自己在大學(xué)階段開(kāi)發(fā)的第一款商業(yè)軟件產(chǎn)品。
別人的大學(xué),別人的第一桶金~
但Jackson并非無(wú)名之輩,年少有為,曾在2014和2015連續(xù)兩年獲得IOI金牌。
因此,大學(xué)一入學(xué),便成為加拿大Michael and Ophelia Lazaridis Olympiad Scholarship獎(jiǎng)學(xué)金的獲得者,免除了8個(gè)學(xué)期學(xué)費(fèi)書費(fèi)和生活費(fèi)。
除了自動(dòng)補(bǔ)全代碼的TabNine,Jackson還開(kāi)發(fā)了很多有意思的應(yīng)用,比如一個(gè)名為jellies的益智游戲,和使用蒙特卡羅樹(shù)搜索的國(guó)際象棋引擎Sashimi等。
TabNine網(wǎng)站:https://tabnine.com/blog/deep
Jackson GitHub主頁(yè):https://github.com/zxqfl
Jackson簡(jiǎn)歷:http://jacobj.ca/resume.html
題圖:pexels,CC0 授權(quán)。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。