FunCoder

FunCoder

高性能Python编程(1):理解Python的“性能”

引子

Python的性能常常被人诟病,但是另一方面Python却又常常出现在高性能计算库中,比如tensorflow,numpy等等,这是为什么呢?Python的性能究竟差在哪里?理想的高性能程序应该是什么样的?如何能写出高性能的Python程序?这个系列我们就尝试探索这些问题的答案。

首先我们退一步看一下组成计算机的基本部分,这样我们才能下手分析和提高程序的执行性能。

计算机三大部分

Read more »

CSAPP 12 并发编程 2

并发可以增加系统的吞吐量,充分利用多核性能,但是并发系统带来的复杂度也需要额外的注意,以免出现不容易debug的bug。

同步机制

并发执行的程序访问栈外共享内存,往往不是由一个CPU指令完成,而是一系列指令。这时,这一些列指令就形成了一个 critical section 。如果不对这些critical section进行处理,就会出现并发bug。

为了避免并发bug,Edsger Dijkstra 提出了 Semaphores ,即信号量来保护 critical section 的指令。Semaphore本质上是一个全局变量,类型为正整数,有两个对应的函数来操作Semaphore:P和V:

Read more »

Python多线程、进程debug技巧

  • 使用 py-spy
  • 利用 /proc/{pid}/ 中的信息

比如查看进程环境变量: cat /proc/{pid}/environ

查看实时进程内部线程的CPU和内存状态:py-spy --nonblocking -p {pid}

查看线程dump:py-spy dump --nonbloacking -p {pid}

Read more »

CSAPP 12 并发编程 (1)

一般来说,应用级别的并发主要由三种方式实现:

  • 进程
  • I/O多路复用
  • 线程

进程

进程是构建并发程序最简单和直接的方式,主要是通过fork, exec, waitpid等系统函数联合实现,而进程间是通过socket两端的文件标识符进行通讯。

Read more »

CSAPP 11 网络编程

网络编程基于之前看到的一些基本概念和抽象:进程、信号、内存映射、内存动态分配。

几乎所有的网络应用程序都基于服务器-客户端模式,即几个或者多个服务度进程和一个或者多个客户端进程,这些进程可以在同一个机器上,也可以分布在其他被网络连接的机器上。

计算机网络包含众多不同类型的机器,这些机器和设备是通过一些列“协议”进行交流的,每一个协议都包含两个基本部分:命名规则和传输规则。

TCP/IP协议

Read more »

CSAPP 10 系统IO

Unix系统中的IO,即Input和Output是指从“文件”读入数据到内存和从内存输出数据到“文件”。“文件”是Unix的一个抽象,即一串字节。在概念上所有IO设备都可以抽象成文件,比如网络、硬盘、各种外设等等。这样系统就可以统一接口来操作外设。

Unix系统提供了四个基本的IO API:

  • int open(char *filename, int flags, mode_t mode)
  • int close(int fd)
  • ssize_t read(int fd, void *buf, size_t n)
  • ssize_t write(int fd, void *buf, size_t n)

其实这四个api的道理非常简单,open会返回一个文件标识符,就是打开了一个内存和文件的通道,read就是把文件标识符指向的文件中的字节输入到buf指向的内存空间,而write刚好相反,把buf指向的内存空间的字节输入到文件中。

Read more »

CSAPP 9:虚拟内存

虚拟内存的三个重要功能:

  • 将物理内存作为一种缓存,缓存硬盘上的一个私有内存地址空间
  • 让每一个进程拥有独立的内存地址空间
  • 确保进程之间的内存不会互相影响

理解虚拟内存的关键在于意识到:一个数据对象(字节)可以有多个属性(地址)。话句话说,一个内存对象可以有两个地址,一个物理地址,一个虚拟内存地址。

虚拟内存:缓存

Read more »

信息爆炸,炸毁了我

最近发现了一个现象,我似乎没有办法坚持做一件事情很长时间了,而且这个“很长时间”变得原来越短了!

上一次我自发的坚持一件事情很长时间应该是考研。那已经是10年前的事情了,那时候我坚持每天去自习室学习超过6小时,持续了将近9个月时间,几乎没有间断过。再上一次可能是高考,算是坚持了三年学习,但那已经是13年前的事情了。

读博士以后,我集中精力做一件事情的能力就慢慢变弱了,那是大概6年前。比如做实验加写论文有时候可以到3个月左右。参加工作后,业余时间我还是想多学点东西或者做一些工作之外的事情,但是我渐渐发现我很难坚持了!开始的时候仅仅是不能坚持学完一门公开课(大概需要3个月左右),后面变成不能完整的阅读一本书(大概1个月左右),目前已经慢慢出现不能完整地读完一篇论文了(大概需要几天到1周时间)。更可怕的,我甚至难以完整的阅读一篇报道或者博客了(十几分钟到几小时),经常是读了一半就是去兴趣或者被其他信息拉走了。比如,我会在上网阅读书籍的时候,不定期的打开知乎、youtube、股票报价、微信等等,浏览一些信息,甚至有时候我会完全无目地滑动网页、切换窗口等等,然后回到我刚才在做的事情上,如此循环。到头来往往是时间过去了,什么都没得到。

短短十几年时间,我坚持做一件事情的能力从3年下降到了30分钟,甚至3分钟。(比如,你可以坚持读完这篇博客吗?)

Read more »

量子计算索引

公开课程

其他人整理的资源

Read more »

CSAPP 8 异常控制流(ECF)

异常控制流,Exception Control Flow,是操作系统实现IO、进程、虚拟内存、并发等等功能的的重要基础工具。

异常

这里提到的异常不是通常意义的异常,而是分成四类:Interrupt, faults, aborts, and trap.

进程

Read more »
0%