### 內置函數
```python
dic = {'a':1,'c':3,'b':2}
dic = sorted(dic.items()) # 內置函數sorted
{k:v for k,v in dic} # 列表推導式
```
### 進程與線程
1. 線程是程序執行的最小單位,而進程是操作系統分配資源的最小單位;
2. 一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執行路線;
3. 進程之間相互獨立,但同一進程下的各個線程之間共享程序的內存空間(包括代碼段、數據集、堆等)及一些進程級的資源,某個進程內的線程其他進程不可見;
4. 調度和切換:線程上下文切換比進程上下文切換要快的多;
***線程和進程都是一種抽象的概念,線程是一種比進程更小的抽象,線程和進程都可用于實現并發。***

#### Thead
- `join`:阻塞主線程
- `start`:啟動線程
- `setDaemon`:守護主線程,主線程結束,殺死子進程
- `theading.Lock()`:線程鎖
- `lock.acquire()`:獲取鎖
- `lock.release()`:釋放鎖
### GIL全局解釋鎖
> ***Global Interpreter Lock***
> 為了更有效的利用多核處理器的性能,就出現了多線程的編程方式,而隨之帶來的就是線程之間數據一致性和狀態同步的困難.為了有效解決多份緩存之間的數據同步時,產生了GIL.
> GIL是全局排他鎖.毫無疑問全局鎖的存在會對多線程的效率有不小影響。甚至就幾乎等于Python是個單線程的程序。
> 從`release GIL`到`acquire GIL`之間幾乎是沒有間隙的。所以當其他在其他核心上的線程被喚醒時,大部分情況下主線程已經又再一次獲取到GIL了。這個時候被喚醒執行的線程只能白白的浪費CPU時間,看著另一個線程拿著GIL歡快的執行著。然后達到切換時間后進入待調度狀態,再被喚醒,再等待,以此往復惡性循環。
Python GIL其實是功能和性能之間權衡后的產物,它尤其存在的合理性,也有較難改變的客觀因素。從本分的分析中,我們可以做以下一些簡單的總結:
* 因為GIL的存在,只有IO Bound場景下得多線程會得到較好的性能
* 如果對并行計算性能較高的程序可以考慮把核心部分也成C模塊,或者索性用其他語言實現
* GIL在較長一段時間內將會繼續存在,但是會不斷對其進行改進
### IPython缺省值
`datetime?` 顯示對象的信息
`datetime??` 顯示對象源碼
`%timeit np.dot(a, a)` 測量任何python語句