分类目录归档:Python

Python编程相关的技术文章

【转】MySQL TPS 和 QPS 的统计和IOPS,附一个python脚本

MySQL TPS 和 QPS 的统计和IOPS
http://kan.weibo.com/con/3523021944781882

MySQL的QPS计算
show global status where Variable_name in(‘com_select’,’com_insert’,’com_delete’,’com_update’);
等待10秒
show global status where Variable_name in(‘com_select’,’com_insert’,’com_delete’,’com_update’);

QPS:$stat_val{“Com_select”} + $stat_val{“Com_insert”} + $stat_val{“Com_update”} + $stat_val{“Com_delete”},

计算差值
MySQL的TPS计算
show global status where Variable_name in(‘com_insert’,’com_delete’,’com_update’);
等待10秒
show global status where Variable_name in(‘com_insert’,’com_delete’,’com_update’);
计算差值

TPS:$stat_val{“Com_insert”} + $stat_val{“Com_update”} + $stat_val{“Com_delete”},

磁盘IOPS计算与测量

IOPS 是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。随机读写频繁的应用,如OLTP,IOPS是关键衡量指标。
数据吞吐量(Throughput),指单位时间内可以成功传输的数据数量。对于大量顺序读写的应用,如VOD(Video On Demand),则更关注吞吐量指标。
磁盘完成一个I/O请求所花费的时间,它由寻道时间、旋转延迟和数据传输时间三部分构成。
寻道时间Tseek是指将读写磁头移动至正确的磁道上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms。
旋转延迟Trotation是指盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间。旋转延迟取决于磁盘转速,通常使用磁盘旋转一周所需时间的1/2表示。比如,7200 rpm的磁盘平均旋转延迟大约为60*1000/7200/2 = 4.17ms,而转速为15000 rpm的磁盘其平均旋转延迟约为2ms。
数据传输时间Ttransfer是指完成传输所请求的数据所需要的时间,它取决于数据传输率,其值等于数据大小除以数据传输率。目前IDE/ATA能达到133MB/s,SATA II可达到300MB/s的接口数据传输率,数据传输时间通常远小于前两部分时间。

因此,理论上可以计算出磁盘的平均最大IOPS,即IOPS = 1000 ms/ (Tseek + Troatation),忽略数据传输时间。假设磁盘平均物理寻道时间为3ms, 磁盘转速为7200,10K,15K rpm,则磁盘IOPS理论最大值分别为,
IOPS = 1000 / (3 + 60000/7200/2) = 140
IOPS = 1000 / (3 + 60000/10000/2) = 167
IOPS = 1000 / (3 + 60000/15000/2) = 200
固态硬盘SSD是一种电子装置, 避免了传统磁盘在寻道和旋转上的时间花费,存储单元寻址开销大大降低,因此IOPS可以非常高,能够达到数万甚至数十万。实际测量中,IOPS数值会受到很多因素的影响,包括I/O负载特征(读写比例,顺序和随机,工作线程数,队列深度,数据记录大小)、系统配置、操作系统、磁盘驱动等等。
因此对比测量磁盘IOPS时,必须在同样的测试基准下进行,即便如何也会产生一定的随机不确定性。通常情况下,IOPS可细分为如下几个指标:
Toatal IOPS,混合读写和顺序随机I/O负载情况下的磁盘IOPS,这个与实际I/O情况最为相符,大多数应用关注此指标。
Random Read IOPS,100%随机读负载情况下的IOPS。
Random Write IOPS,100%随机写负载情况下的IOPS。
Sequential Read IOPS,100%顺序负载读情况下的IOPS。
Sequential Write IOPS,100%顺序写负载情况下的IOPS。
IOPS的测试benchmark工具主要有Iometer, IoZone, FIO等,可以综合用于测试磁盘在不同情形下的IOPS。对于应用系统,需要首先确定数据的负载特征,然后选择合理的IOPS指标进行测量和对比分析,据此选择合适的存储介质和软件系统。下面的磁盘IOPS数据来自http://en.wikipedia.org/wiki/IOPS [1],给大家一个基本参考。

#!/usr/bin/env python
#coding=utf-8

import time
import sys
import os
#MySQLdb查询
import MySQLdb

conn = MySQLdb.connect(host='127.0.0.1',port=3306,user='root',passwd='123456', charset='utf8')
conn.autocommit(True)
cursor=conn.cursor()

while True:
    diff = 1
    sql = "show global status where Variable_name in('com_select','com_insert','com_delete','com_update')"
    cursor.execute(sql)
    results = cursor.fetchall()
    first = []
    for rec in results:
        first.append(rec[1])

    time.sleep(diff)
    sql = "show global status where Variable_name in('com_select','com_insert','com_delete','com_update')"
    cursor.execute(sql)
    results = cursor.fetchall()
    second = []
    for rec in results:
        second.append(rec[1])

    qps = 0
    tps = 0
    for i in range(0, 4):
        if i != 0:
            b = int(second[i]) - int(first[i])
            tps += b

        a = int(second[i]) - int(first[i])
        qps += a

    print 'qps = %s'%(qps/diff)
    print 'tps = %s'%(tps/diff)
conn.close()

python expect 登陆服务器交互

很简单,但是很实用的登陆服务器脚本,分成两个,一个是写死用户名和密码的,一个是需要输入用户和密码的

1、自动登陆

#!/usr/bin/python
#coding=utf-8

import pexpect
import sys
import os

def usage():
	print "usage: ./k "
	sys.exit(1)

if len(sys.argv) != 2:
	usage()

if __name__ == '__main__':
		port = "22"
		user = "root"
		passwd = "123456"
		cmd = 'ssh -p %s %s@%s'%(port, user, sys.argv[1])
		ssh = pexpect.spawn(cmd, [], 86400)
		try:
			while True:
					i = ssh.expect(['assword: ', 'continue connecting (yes/no)?'])
					if i == 0:
							ssh.sendline(passwd)
							break
					elif i == 1:
							ssh.sendline('yes')
		except pexpect.EOF:
				ssh.close()
		else:
				ssh.interact()




2、用户名、密码交互登陆

#!/usr/bin/python
#coding=utf-8

import pexpect
import sys
import os

def usage():
	print "usage: ./k  "
	sys.exit(1)

if len(sys.argv) != 3:
	usage()

if __name__ == '__main__':
		port = "22"
		cmd = 'ssh -p %s %s@%s'%(port, sys.argv[1], sys.argv[2])
		ssh = pexpect.spawn(cmd, [], 86400)
		try:
			while True:
					i = ssh.expect(['assword: ', 'continue connecting (yes/no)?'])
					if i == 0:
							#ssh.sendline(passwd)
							#ssh.sendline()
							print "Password: ",
							break
					elif i == 1:
							ssh.sendline('yes')
		except pexpect.EOF:
				ssh.close()
		else:
				ssh.interact()


python urllib/urllib2 get/post使用详解

urllib与urllib2的区别,参见Python:urllib 和urllib2之间的区别
主要区别摘录如下:

1、urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等。
2、urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。

urllib get数据的方法

#!/usr/bin/python
#coding=utf-8

import urllib,urllib2

uri = 'http://www.qieke.com/index.php'
params = {
'_c': 'user',
'_m': 'info',
};

params['user_id']			= 123456
params['user_name'] = '全仔'
params = urllib.urlencode(params)
ret = urllib.urlopen("%s?%s"%(uri, params))
code = ret.getcode()
ret_data = ret.read()

urllib post数据的方法

#!/usr/bin/python
#coding=utf-8

import urllib,urllib2

uri = 'http://www.qieke.com/index.php'
params = {
'_c': 'user',
'_m': 'info',
};

params['user_id']			= 123456
params['user_name'] = '全仔'
params = urllib.urlencode(params)
ret = urllib.urlopen(uri, params)
code = ret.getcode()
ret_data = ret.read()

python mongodb

下载pymongo
pymongo 文档
安装pymongo

tar zxvf  pymongo-1.10.1
cd pymongo-1.10.1
python  setup.py  build
python  setup.py  install

测试用例

#!/usr/bin/python
#coding:utf-8
import pymongo
con = pymongo.Connection('127.0.0.1', 65431)
mydb = con.mydb				# new a database
mydb.add_user('test','test')		# add a user
mydb.authenticate('test','test')	# check auth
muser = mydb.user			# new a table
muser.save({'id':1, 'name':'test'})	# add a record
muser.insert({'id':2, 'name':'hello'})	# add a record
muser.find_one()			# find a record
muser.find_one({'id':2})		# find a record by condition
muser.create_index('id')
muser.find().sort('id',pymongo.ASCENDING)	# DESCENDING
#muser.drop()				# delete table
muser.find({'id':1}).count()		# get records number
muser.find({'id':1}).limit(3).skip(2)	# start index is 2 limit 3 records
muser.remove({'id':1})			# delete records where id = 1
muser.update({'id':2},{'$set':{'name':'haha'}})	# update one record
muser.find_one({'id':2})

python memcache

下载cmemcache
下载libmemcache
安装libmemcache库

tar  jxvf  libmemcache-1.4.0.rc2.tar.bz2
cd  libmemcache-1.4.0.rc2
./configure
make 
make install
ldconfig

安装cmemcache支持库

tar jxvf  cmemcache-0.95.tar.bz2
cd cmemcache-0.95
python  setup.py  build
python  setup.py  install

编写cmemcache的python测试用例,cmemcache类的具体用法,可以参考cmemcache-0.95/cmemcache.py文件

#!/usr/bin/python
import cmemcache
mc = cmemcache.Client(['127.0.0.1:11211'])
mc.set('python-key2', 'Stam He')
value = mc.get('python-key2')
print value
mc.set('python-key3',3)
print mc.get('python-key3')
print mc.incr('python-key3')
print mc.decr('python-key3')
print mc.delete('python-key3')
print mc.get('python-key3')

python pexpect

python 使用pexpect
下载pexpect
安装pexpect模板

tar zxvf pexpect-pexpect.tar.gz
cd pexpect
python  setup.py.template  build
python  setup.py.template  install

编写expect测试代码

#!/usr/bin/python
#coding:utf-8

import pexpect

def ssh_cmd(ip, user, passwd, cmd):
	ssh = pexpect.spawn('ssh %s@%s "%s"'%(user, ip, cmd))
	r = ''
	try:
		while True:
			i = ssh.expect(['Password: ', 'continue connecting (yes/no)?'])
			if i == 0:
				ssh.sendline(passwd)
				break
			elif i == 1:
				ssh.sendline('yes')
	except pexpect.EOF:
		ssh.close()
	else:
		r = ssh.read()
		ssh.expect(pexpect.EOF)
		ssh.close()

	return r

# hosts格式
# 主机IP:用户名:密码:命令(多个命令用逗号隔开)
#192.168.117.100:root:123456:who,ls
hosts = '''
192.168.117.249:root:123456:df -hT,uptime,ls -a,who
'''

for host in hosts.split("\n"):
	if host:
		ip, user, passwd, cmds = host.split(":")
		for cmd in cmds.split(","):
			print "--- %s cmd: %s ---"%(ip, cmd)
			print ssh_cmd(ip, user, passwd, cmd)

python之强大的日志模块logging

python之强大的日志模块logging

1.简单的将日志打印到屏幕

import logging

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

屏幕上打印:
WARNING:root:This is warning message

默认情况下,logging将日志打印到屏幕,日志级别为WARNING

日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET

当然也可以自己定义日志级别。

2.通过logging.basicConfig函数对日志的输出格式及方式做相关配置

import logging

logging.basicConfig(level=logging.DEBUG,
                format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                datefmt='%a, %d %b %Y %H:%M:%S',
                filename='myapp.log',
                filemode='w')
    
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

./myapp.log文件中内容为:

Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message
Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message
Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message

logging.basicConfig函数各参数:
filename: 指定日志文件名
filemode: 和file函数意义相同,指定日志文件的打开模式,’w’或’a’
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(lineno)d: 打印日志的当前行号
%(asctime)s: 打印日志的时间
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

3.将日志同时输出到文件和屏幕

import logging
logging.basicConfig(level=logging.DEBUG,
                format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                datefmt='%a, %d %b %Y %H:%M:%S',
                filename='myapp.log',
                filemode='w')

#################################################################################################
#定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象#
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
#################################################################################################

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

屏幕上打印:

root        : INFO     This is info message
root        : WARNING  This is warning message

./myapp.log文件中内容为:

Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message
Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message
Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message

4.logging之日志回滚

import logging
from logging.handlers import RotatingFileHandler

#################################################################################################
#定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
Rthandler = RotatingFileHandler('myapp.log', maxBytes=10*1024*1024,backupCount=5)
Rthandler.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
Rthandler.setFormatter(formatter)
logging.getLogger('').addHandler(Rthandler)
################################################################################################

从上例和本例可以看出,logging有一个日志处理的主对象,其它处理方式都是通过addHandler添加进去的。
logging的几种handle方式如下:

logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日志输出到文件

日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler

logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets
logging.handlers.DatagramHandler:  远程输出日志到UDP sockets
logging.handlers.SMTPHandler:  远程输出日志到邮件地址
logging.handlers.SysLogHandler: 日志输出到syslog
logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler: 通过"GET"或"POST"远程输出到HTTP服务器

由于StreamHandler和FileHandler是常用的日志处理方式,所以直接包含在logging模块中,而其他方式则包含在logging.handlers模块中,
上述其它处理方式的使用请参见python2.5手册!

5.通过logging.config模块配置日志

#logger.conf

###############################################

[loggers]
keys=root,example01,example02

[logger_root]
level=DEBUG
handlers=hand01,hand02

[logger_example01]
handlers=hand01,hand02
qualname=example01
propagate=0

[logger_example02]
handlers=hand01,hand03
qualname=example02
propagate=0

###############################################

[handlers]
keys=hand01,hand02,hand03

[handler_hand01]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stderr,)

[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form01
args=('myapp.log', 'a')

[handler_hand03]
class=handlers.RotatingFileHandler
level=INFO
formatter=form02
args=('myapp.log', 'a', 10*1024*1024, 5)

###############################################

[formatters]
keys=form01,form02

[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
datefmt=%a, %d %b %Y %H:%M:%S

[formatter_form02]
format=%(name)-12s: %(levelname)-8s %(message)s
datefmt=

上例3:

import logging
import logging.config

logging.config.fileConfig("logger.conf")
logger = logging.getLogger("example01")

logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')

上例4:

import logging
import logging.config

logging.config.fileConfig("logger.conf")
logger = logging.getLogger("example02")

logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')

6.logging是线程安全的
7.logging在低版本(如 2.3.4)中用法有少许差别:

(因为我用 RedHat 4.3 里面自带的版本就是这个)

下面脚本将信息全部输入日志,无终端显示:

#!/usr/bin/env python
import logging
import os,sys
import time

MYNAME = os.path.splitext(os.path.basename(sys.argv[0]))[0]
MYDATE = time.strftime('%y%m%d')
LOG_FILE = os.path.join('/tmp',MYNAME + '.log.' + MYDATE)

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler(LOG_FILE)
formatter = logging.Formatter("%(asctime)-15s %(filename)s [%(levelname)-8s] %(message)s")
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.debug("This is debug message!!!")
logger.info("This is info message!!!")
logger.warn("This is warn message!!!")
logger.error("This is error message!!!")
logger.critical("This is critical message!!!")

下面脚本将日志输入日志,并可选择输出终端日志的级别:

#!/usr/bin/env python
import logging
import os,sys
import time

MYNAME = os.path.splitext(os.path.basename(sys.argv[0]))[0]
MYDATE = time.strftime('%y%m%d')
LOG_FILE = os.path.join('/tmp',MYNAME + '.log.' + MYDATE)

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler(LOG_FILE)
formatter = logging.Formatter("%(asctime)-15s %(filename)s [%(levelname)-8s] %(message)s")
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.debug("This is debug message!!!")
logger.info("This is info message!!!")
logger.warn("This is warn message!!!")
logger.error("This is error message!!!")
logger.critical("This is critical message!!!")

time 模块的用法

time 模块的用法

1、获取时间:

>>> import time
>>> time.localtime(0)        # 本地时间原点
(1970, 1, 1, 8, 0, 0, 3, 1, 0)

>>> time.gmtime(0)         # 格林威治时间原点
(1970, 1, 1, 0, 0, 0, 3, 1, 0)

>>> time.localtime()        # 本地当前时间
(2011, 3, 20, 17, 26, 42, 6, 79, 0)
>>>
>>> time.gmtime()        # 格林威治当前时间
(2011, 3, 20, 9, 26, 42, 6, 79, 0)

>>> time.gmtime(3)        # 格林威治原点偏移 3 秒的时间
(1970, 1, 1, 0, 0, 3, 3, 1, 0)

说明:
gmtime() 是把日期和时间转换为格林威治(GMT)时间的函数,格林威治时间是世界标准时间.
localtime 表示本地时间,是把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为日历时间.
localtime 和 gmtime 返回的类元组包括年, 月, 日, 时, 分, 秒, 星期, 一年的第几天, 日光标志. 年是一个四位数(在有千年虫问题的平台上另有规定), 星期从星期一(数字 0 代表)开始, 1月1日是一年的第一天. 注意中国当地时间和格林威治时间时差 8 个小时,格林位置时间 0 点是中国时间 8 点.

2、格式化时间:

>>> import time

>>> print time.strftime("%a %A %w %b %B -%c- %Y %y %d %H %I %p %Z %j %m %-m %M %U %x %X %%")
Sun Sunday 0 Mar March -Sun Mar 20 18:17:16 2011- 2011 11 20 18 06 PM CST 079 03 3 17 12 03/20/11 18:17:16 %

>>> time.strftime("%Y-%m-%d %H:%M:%S")            # 时间格式化(第一个参数为格式,第二个参数为时间,默认为当前时间)
'2011-03-20 17:07:04'

>>> time.strftime("%Y-%-m-%d %H:%M:%S")            # 03 月输出为 3月.
'2011-3-20 18:18:58'

>>> time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())             # 时间格式化
'2011-03-20 17:30:55'

>>> time.strftime("%Y-%m-%d %H:%M:%S",(2011, 3, 20, 17, 7, 4, 6, 79, -1))     # 时间格式化
'2011-03-20 17:07:04'

>>> time.strptime('2011-03-20 17:07:04','%Y-%m-%d %H:%M:%S')             # 时间反向格式化
(2011, 3, 20, 17, 7, 4, 6, 79, -1)

3、时间偏移计算:

>>> time.time()                # 时间原的偏移时间
1300616588.300797

>>> time.mktime(time.localtime())    # 一个九元组的时间偏移
1300616588.0

>>> (time.time() - time.mktime(time.strptime('2011-03-20 17:07:04','%Y-%m-%d %H:%M:%S'))) / 60        # 判断该时间距离当前时间的时长
60.507132999102275

4、时间等待:

time.sleep(1)            # sleep 1s

python 常用转换函数

python 常用转换函数

python 包含的模块和函数都非常丰富,但在目前版本里缺找不到十进制到二进制转化的现成函数,看到网友在帖子里发了一个关于二进制转化的小段,把它转过来,顺便也添加一些类似的函数,一起作为学习的笔记:

#!/usr/bin/python

def bin(x):
        result = ''
        x = int(x)
        while x > 0:
                mod = x % 2
                x /= 2
                result = str(mod) + result
        return result

if __name__ == '__main__':
        print bin(12)

上边小段程序可以帮你轻松的事先十进制到二进制的转化工作。

应用:

import bin
bin.bin(123)
或者:
from bin import bin
bin(123)

下边给出其他相关进制转化的函数:

10进制转2进制:bin(123)
2进制转10进制:int(’10’,2)

10进制转16进制:hex(10)
16进制转10进制:int(‘f’,16) 或 int(0xf)

10进制转8进制:oct(18)
8进制转10进制:int(‘022’,8)

字符转化为ASCII: ord(‘A’)
ASCII转化为字符:chr(65)

小写字母转大写:string.upper()
大写字母转小写:string.lower()

下面是数据类型相关的转化函数:

int() 函数把数字和字符串转换成一个整数。
str() 函数把对象转换成可打印字符串。
float()函数把一个数字或字符串转换成浮点数。
long() 函数把数字和字符串转换成长整数。
list() 函数可将序列对象转换成列表。

其他类型的常用函数:

min() 函数返回给定参数的最小值,参数可以为序列。
max() 函数返回给定参数的最大值,参数可以为序列。
cmp() 函数比较x和y两个对象,并根据比较结果返回一个整数,如果xy,则返回1,如果x==y则返回0。

abs() 返回一个数字的绝对值。
divmod(x,y) 函数完成除法运算,返回商和余数。
pow() 函数返回以x为底,y为指数的幂。
round(x[,n]) 函数返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。

callable() 函数用于测试对象是否可调用,如果可以则返回1(真);否则返回0(假)。
type() 函数可返回对象的数据类型。

len() 函数返回字符串和序列的长度。
range()函数可按参数生成连续的有序整数列表。

一个简单的自定义函数的示范:

def myfun(x): return x+1
>>> myfun(3)

一个经典的计算程序耗时的示范:

#!/usr/bin/env python

import time

startTime = time.time()
    do somthings
endTime = time.time()
print "Finished in %f seconds!" % (endTime - startTime)

结果:

Finished in 0.375000 seconds!

python 简单编译方法

python 简单编译方法

python 自带了一个编译器,在普通使用的情况下,可以将脚本编译,让其他用户看不见源代码:
1、导入compiler模块

[root@server01 ~]# python
>>> import compiler

2、编译源文件

>>> compiler.compileFile('a.py')

3、查看编译后的文件,默认将会生成 filename.pyc

[root@server01 ~]# ll a.py
a.py   a.pyc 

4、运行编译后脚本

[root@server01 ~]# python a.pyc
OK!