这里有两个测量值:
timeit.timeit('"toto"=="1234"', number=100000000)
1.8320042459999968
timeit.timeit('"toto"=="toto"', number=100000000)
1.4517491540000265
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,比较两个匹配的字符串比比较两个大小相同但不匹配的字符串要快。这是相当令人不安的:在字符串比较期间,我相信 Python 正在逐个字符地测试字符串,因此"toto"=="toto"测试时间应该比"toto"=="1234"它需要针对一个不匹配比较进行四次测试的时间更长。也许比较是基于哈希的,但在这种情况下,两次比较的时间应该相同。
为什么?
在网站上,我使用django提出一些请求:
django线:
CINodeInventory.objects.select_related().filter(ci_class__type='equipment',company__slug=self.kwargs['company'])
Run Code Online (Sandbox Code Playgroud)
生成一个MySQL查询,如下所示:
SELECT *
FROM `inventory_cinodeinventory`
INNER JOIN `ci_cinodeclass` ON ( `inventory_cinodeinventory`.`ci_class_id` = `ci_cinodeclass`.`class_name` )
INNER JOIN `accounts_companyprofile` ON ( `inventory_cinodeinventory`.`company_id` = `accounts_companyprofile`.`slug` )
INNER JOIN `accounts_companysite` ON ( `inventory_cinodeinventory`.`company_site_id` = `accounts_companysite`.`slug` )
INNER JOIN `accounts_companyprofile` T5 ON ( `accounts_companysite`.`company_id` = T5.`slug` )
WHERE (
`ci_cinodeclass`.`type` = 'equipment'
AND `inventory_cinodeinventory`.`company_id` = 'thecompany'
)
ORDER BY `inventory_cinodeinventory`.`name` ASC
Run Code Online (Sandbox Code Playgroud)
问题是主表中只有40 000个条目,处理需要0.5秒.
我检查了所有索引,创建了排序或加入所需的索引:我仍然有问题.
有趣的是,如果我用LEFT JOIN替换最后一个INNER JOIN,请求速度要快10倍!不幸的是,由于我使用django进行请求,我无法访问它生成的SQL请求(我不想自己做原始SQL).
作为"INNER JOIN"的最后一次加入,EXPLAIN给出:
+----+-------------+---------------------------+--------+----------------------------------------------------------------------------------------------------------+------------------------------------+---------+------------------------------------------------+-------+---------------------------------+
| id | select_type | table | type | possible_keys | key …Run Code Online (Sandbox Code Playgroud) 我有一个主django服务器存储数据(mysql数据库).
在线:我希望很多用户能够在他们的笔记本电脑上同步这个数据库的副本(只能复制delta)(sqlLite DB)
脱机(用户无权访问主服务器):用户可以查看和更新其本地数据库.
返回在线:已在用户笔记本电脑上修改的内容将同步回主django服务器.
我认为,由于我有两种数据库,我需要在django对象级别进行同步.是否有django应用程序这样做?如果没有,你将如何编写这样的功能?
我做了一个小测试用例来比较YAML和JSON的速度:
import json
import yaml
from datetime import datetime
from random import randint
NB_ROW=1024
print 'Does yaml is using libyaml ? ',yaml.__with_libyaml__ and 'yes' or 'no'
dummy_data = [ { 'dummy_key_A_%s' % i: i, 'dummy_key_B_%s' % i: i } for i in xrange(NB_ROW) ]
with open('perf_json_yaml.yaml','w') as fh:
t1 = datetime.now()
yaml.safe_dump(dummy_data, fh, encoding='utf-8', default_flow_style=False)
t2 = datetime.now()
dty = (t2 - t1).total_seconds()
print 'Dumping %s row into a yaml file : %s' % (NB_ROW,dty)
with open('perf_json_yaml.json','w') as fh:
t1 …Run Code Online (Sandbox Code Playgroud) 我的表中有固件版本字符串(如"4.2.2"或"4.2.16")
我该如何比较,选择或排序?
我不能使用标准字符串比较:SQL看到"4.2.2"大于"4.2.16"
作为版本字符串,我希望4.2.16大于4.2.2
我想考虑固件版本中可能有chars:4.24a1,4.25b3 ...为此,通常,带字符的子字段具有固定长度.
如何进行 ?
我在nginx + uwsgi上尝试django.它工作得很好(比apache mod_wsgi快),但是如果我有超过100个并发连接(即:用ab -n 100000 -c 150 http:// localhost:8081 /测试),我在uwsgi日志上有一些损坏的管道:
nginx.conf:
user myuser;
worker_processes 8;
events {
worker_connections 30000;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream django {
ip_hash;
server unix:/home/myuser/tmp/uwsgi.sock;
}
server {
listen 8081;
server_name localhost;
location / {
uwsgi_pass django;
include uwsgi_params;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
Run Code Online (Sandbox Code Playgroud)
uwsgi是这样开始的:
/usr/local/bin/uwsgi -s /home/myuser/tmp/uwsgi.sock --pp /home/myuser/projects/django/est/nginx --module django_wsgi -L -l 500 -p …Run Code Online (Sandbox Code Playgroud) 我作为一个没有特权的用户在linux和Solaris上运行这个小的python脚本:
#!/usr/bin/python
import os
print 'uid,euid =',os.getuid(),os.geteuid()
Run Code Online (Sandbox Code Playgroud)
在运行之前,setuid位在脚本上设置(而不是在python解释器上):
chown root:myusergrp getuid.py
chmod 4750 getuid.py
Run Code Online (Sandbox Code Playgroud)
在Solaris上,由于setuid位而设置了有效uid:
uid,euid = 10002 0
Run Code Online (Sandbox Code Playgroud)
但不是在Linux上:
uid,euid = 10002 10002
Run Code Online (Sandbox Code Playgroud)
请注意,Solaris和Linux的python版本均为2.6
是否可以让Python Linux作为Python Solaris运行?
我正在使用这样的代码创建自定义django模板标记:
@register.simple_tag(takes_context=True)
def render_listing(context, *args, **kwargs):
... my code ...
Run Code Online (Sandbox Code Playgroud)
这很好用,但在我的模板中,似乎所有参数都必须在一行上,例如:
这工作:
{% render_listing param1=val1 param2=val2 ... paramN=valN %}
Run Code Online (Sandbox Code Playgroud)
但是在多行上,它不起作用:
{% render_listing param1=val1
param2=val2
...
paramN=valN %}
Run Code Online (Sandbox Code Playgroud)
我尝试了多个转义序列,但我没有成功,
有没有办法在多行上指定模板标签?
用于通过使用python subprocess.Popen制作一些shell命令的django应用程序不再起作用,因为我升级到ubuntu到11.10
为了简化问题,我将错误的代码放入wsgi脚本:
import os
import sys
from subprocess import Popen,PIPE
p=Popen(['/usr/bin/id'],stdout=PIPE,stderr=PIPE)
comm=p.communicate()
print comm,p.returncode
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Run Code Online (Sandbox Code Playgroud)
如果我直接通过python运行这段代码,它可以工作:
$ python -V
Python 2.7.2+
$ python django_wsgi.py
('uid=1002(www) gid=1002(www) groups=1002(www)\n', '') 0
Run Code Online (Sandbox Code Playgroud)
如果我通过apache运行此代码(我只是将相关的URL放入浏览器),在apache日志中,我得到:
[Tue Nov 29 11:34:38 2011] [error] ('', '') -6
Run Code Online (Sandbox Code Playgroud)
这个错误是什么'-6'???
问题是,使用我的开发服务器(Ubuntu 10.04,几乎相同的apache/wsgi版本,相同的apache配置文件,相同的环境变量,但使用python 2.6.5),它运行良好:
[Tue Nov 29 11:29:10 2011] [error] ('uid=1000(www) gid=1000(www) groups=1000(www)\\n', '') 0
Run Code Online (Sandbox Code Playgroud)
你知道为什么Popen不再用python 2.7通过apache工作了吗?
几个月前我发现了mongodb,在看过这篇文章后,我觉得mongodb真的比mysql快,所以我决定建立自己的替补,问题是我的结果与上面帖子的作者不一样,特别是查询数据库:mongodb似乎比MyISAM表慢.你能看看我的python代码,可能是它有什么问题:
from datetime import datetime
import random
import MySQLdb
import pymongo
mysql_db=MySQLdb.connect(user="me",passwd="mypasswd",db="test_kv")
c=mysql_db.cursor()
connection = pymongo.Connection()
mongo_db = connection.test
kvtab = mongo_db.kvtab
nb=1000000
thelist=[]
for i in xrange(nb):
thelist.append((str(random.random()),str(random.random())))
t1=datetime.now()
for k,v in thelist:
c.execute("INSERT INTO key_val_tab (k,v) VALUES ('" + k + "','" + v + "')")
dt=datetime.now() - t1
print 'MySQL insert elapse :',dt
t1=datetime.now()
for i in xrange(nb):
c.execute("select * FROM key_val_tab WHERE k='" + random.choice(thelist)[0] + "'")
result=c.fetchone()
dt=datetime.now() - t1
print 'MySQL select …Run Code Online (Sandbox Code Playgroud)