小编Eri*_*ric的帖子

为什么比较匹配的字符串比比较不匹配的字符串更快?

这里有两个测量值:

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"它需要针对一个不匹配比较进行四次测试的时间更长。也许比较是基于哈希的,但在这种情况下,两次比较的时间应该相同。

为什么?

python comparison performance

77
推荐指数
2
解决办法
8022
查看次数

慢MySQL"INNER JOIN"

在网站上,我使用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)

mysql django

26
推荐指数
2
解决办法
4953
查看次数

用于脱机使用的django数据库同步

我有一个主django服务器存储数据(mysql数据库).

在线:我希望很多用户能够在他们的笔记本电脑上同步这个数据库的副本(只能复制delta)(sqlLite DB)

脱机(用户无权访问主服务器):用户可以查看和更新​​其本地数据库.

返回在线:已在用户笔记本电脑上修改的内容将同步回主django服务器.

我认为,由于我有两种数据库,我需要在django对象级别进行同步.是否有django应用程序这样做?如果没有,你将如何编写这样的功能?

django data-synchronization

20
推荐指数
2
解决办法
2779
查看次数

我可以加速YAML吗?

我做了一个小测试用例来比较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)

python json yaml

17
推荐指数
3
解决办法
7823
查看次数

如何比较MySQL中的版本字符串("xyz")?

我的表中有固件版本字符串(如"4.2.2"或"4.2.16")

我该如何比较,选择或排序?

我不能使用标准字符串比较:SQL看到"4.2.2"大于"4.2.16"

作为版本字符串,我希望4.2.16大于4.2.2

我想考虑固件版本中可能有chars:4.24a1,4.25b3 ...为此,通常,带字符的子字段具有固定长度.

如何进行 ?

python mysql sql django natural-sort

13
推荐指数
3
解决办法
7052
查看次数

django与nginx + uwsgi

我在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)

nginx uwsgi

12
推荐指数
1
解决办法
5597
查看次数

Setuid位于python脚本:Linux vs Solaris

作为一个没有特权的用户在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运行?

python linux solaris setuid

12
推荐指数
1
解决办法
2万
查看次数

django模板标签在多行上

我正在使用这样的代码创建自定义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)

我尝试了多个转义序列,但我没有成功,

有没有办法在多行上指定模板标签?

django

11
推荐指数
2
解决办法
2926
查看次数

Popen不再使用apache/wsgi和python 2.7.2了吗?

用于通过使用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工作了吗?

python apache mod-wsgi

9
推荐指数
1
解决办法
1768
查看次数

MongoDB不比MySQL快吗?

几个月前我发现了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)

python mysql mongodb

8
推荐指数
2
解决办法
6261
查看次数