blog.Ring.idv.tw

2009 August

淺談Tuple

Tuple.在Python程式語言中是一個immutable data structure,也可以將它當做是immutable list,也由於它是不可變的,所以它沒有像list擁有的一些append、remove等函式可供使用,那這樣的話為何還需要它呢?大致上有下述三點:

1. 它可以讓程式更具安全性,這裡的安全性指的是它具備不被更改的可能

2. 由於它是immutable,所以也可以用來當作dictionary的key來使用。

3. 和list相較之下,Tuple在建構時的速度上較快

下述來看一些實例:

>>> def a():
...     x = [1,2,3]
... 
>>> def b():
...     x = (1,2,3)
... 
>>> import dis
>>> dis.dis(a)
  2           0 LOAD_CONST               1 (1)
              3 LOAD_CONST               2 (2)
              6 LOAD_CONST               3 (3)
              9 BUILD_LIST               3
             12 STORE_FAST               0 (x)
             15 LOAD_CONST               0 (None)
             18 RETURN_VALUE        
>>> dis.dis(b)
  2           0 LOAD_CONST               4 ((1, 2, 3))
              3 STORE_FAST               0 (x)
              6 LOAD_CONST               0 (None)
              9 RETURN_VALUE        

從上述這兩個bytecode instructions來看,在建構Tuple所需要的指令較少,也意謂著在建構時的速度較快,實證如下:

python -m timeit "x=(1,2,3,4,5,6,7,8,9,10)"
10000000 loops, best of 3: 0.0261 usec per loop
python -m timeit "x=[1,2,3,4,5,6,7,8,9,10]"
10000000 loops, best of 3: 0.177 usec per loop

透過Tuple大約只耗費了「0.0261 usec」,至於List則需要「0.177 usec」左右~ 但如果比較兩者存取的速度上來看,List會顯得較有效率上的優勢。

python -m timeit -s "x=(1,2,3,4,5,6,7,8,9,10)" "y=x[3]"
10000000 loops, best of 3: 0.0649 usec per loop
python -m timeit -s "x=[1,2,3,4,5,6,7,8,9,10]" "y=x[3]"
10000000 loops, best of 3: 0.0584 usec per loop

相關資源

Are tuples more efficient than lists in Python?

32.12. dis — Disassembler for Python bytecode

2009-08-23 17:11:13 | Add Comment

Google Street View 心得

Google在今日正式對外開放在台灣的街景服務(Google Street View),根據幕後秘辛的說明,Google街景拍攝車的上頭主要使用「9」部朝向不同方向的照相機所組成,以提供「水平 360°」和垂直「290°」的街道全景圖,雖然目前只有提供台北地區的街景,不過未來還會有下述地點:

P.S. 筆者幼時的家鄉「鹿港」居然也包含在內 ^^

雖然台灣街景服務今天才剛正式開放,不過已經有許多先行者分享了相關心得(請見底下相關資訊),所以本篇的介紹傾向從Web的角度來看。

Google Street View - 淡江中學

筆者以不能說的秘密電影拍攝地「淡江中學」來介紹,透過上圖的影像可以得知,左方側欄是提供Google Maps的相關資訊,右方側欄則是一個採用Flash動畫的街景服務,利用Firefox外掛Firebug的資訊攔截,在XHR的面版上可以得知有三個請求,其一就是提供左方側欄資訊的JSON資料交換格式(實際範例)。

第二個應該是提供可替換的「衣夾人」組態設定(這個名字的由來是因為它的形狀像一個衣夾。),他出現在「Google 地圖」視窗左側的縮放工具列上方。若他變成黃色,即表示目前的位置可提供「街景服務」,從這個實際例子中可以得知,裡頭包含了五個不同的衣夾人圖形,不過筆者實際測試的結果,目前所提供的五個圖形URL只有兩個是正確的,它們分別為「Legopeg」和「Panda」,這部份未來也許是可以替換的。

至於最後一個請求則是提供右側Flash形式的街景服務中的XML文字資訊(如上圖:真理街),這部份應該是直接透過街景服務的Flash直接下請求(筆者猜測),透過此Flash動畫資訊中的metadata得知它是採用Adobe Flex 3開發的,此動畫裡頭包含了11張基本工具列的影像資訊:

至於實際的街景影像則是一張張512*512由Google處理過的JPEG影像去組合起來的(如:實際影像),而關於如何組合這樣的全景影像可參考The Stanford CityBlock Project,最後暫且不論Google為何採用Flash來呈現街景服務,Flash在網路上不可或缺的地位又提升了不少。

附帶提一下,Google的伺服器不只多~ 主機名稱也挺多的,上述這些請求的伺服器主機名稱就有「gws」(這比較好猜)、「LocalTrends/1.0」、「mfe」和「Alleycat Server 1.0」(野貓?)

相關資訊

Google Maps開放台灣版街景地圖(Street View)

oogle Maps Street View 台北街景地圖上線&!上網遊覽台北101 | 電腦玩物

台北的Google Street View(Google街景)上線了!

iPhone上的Google Street View (Google街景)

2009-08-18 23:29:49 | Add Comment

標籤雲(Tag Cloud)

Tag Cloud(或word cloud).它屬於視覺化介面的一種呈現方式~ 基本上是透過字母的排列順序和次數權重來決定字型大小的呈現,根據wikipedia的記載~ Tag Cloud最初是由Flickr率先開始使用,至於這個詞是由誰提出來的.. 筆者尚未找到有力的參考文獻~

另外Tag Cloud - Wiki也提供了「Computation of the tag size」公式計算,如下所示:

套用此公式的結果:

從上圖的結果可以發現,上述公式對於權重和字型大小之間的運算結果,會導致字型範圍「1px」至「20px」的情形發生,但基本上當字型大小小於「10px」就不容易閱讀和點選,所以筆者修改了此公式,希望它能自行定義Tag Cloud的字型大小範圍「10px」至「20px」,如下圖所示:

如此便能依照權重比例和字型大小形成相互的對應:

index.py

#! /usr/bin/python
from mod_python import psp

def index(req):
        param = {}
        req.content_type = 'text/html'
        tags = [('aggregators',2),('blogs',3),('wikis',4),('usability',5),('widgets',6),('ajax',7),('social',10),('Folksonomy',15)]
        tags.sort()
        param['Tags'] = tags

        tmpl = psp.PSP(req,'index.tmpl')
        tmpl.run(param)

index.tmpl

<html>
<head>
<title>Tag Cloud</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css" media="all">
.tagcloud
{
        width: 200px;
        height: 100px;
}
</style>
</head>
<body>
<div class="tagcloud">
<%
Clist = [_t[1] for _t in Tags]
Tmax = max(Clist)
Tmin = min(Clist)
Fmax = 20
T = Tmax - Tmin

for _t in Tags:
        if _t[1] > Tmin:
                si = Fmax * (_t[1] - Tmin) / T 
        else:
                si = 1
        
%>
<span style='font-size: <%=si%>px'><a href="#"><%=_t[0]%></a></span> 
<%
# end for
%>
</div>
<div class="tagcloud">
<%
Fmin = 10

for _t in Tags:
        if _t[1] > Tmin:
                si = (Fmax - Fmin) * (_t[1] - Tmin) / T + Fmin
        else:
                si = Fmin
        
%>
<span style='font-size: <%=si%>px'><a href="#"><%=_t[0]%></a></span> 
<%
# end for
%>
</div>
</body>
</html>

2009-08-12 01:02:07 | Add Comment

Copyright (C) Ching-Shen Chen. All rights reserved.

::: 切換內文字級 :::

::: 分類 :::

::: 搜尋 :::

Ching-Shen Chen

::: 文件歸檔 :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment

::: 人氣指數 :::

今日人氣:196

累積人氣:898906


::: 線上人數 :::

counter