几个月前我发现了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) 我有2个Django型号:
class A(models.Model):
uniq_name = models.CharField(max_length=30,primary_key=True)
info1 = models.CharField(max_length=30)
info2 = models.CharField(max_length=30)
class B(models.Model):
a = models.ForeignKey(A)
info3 = models.CharField(max_length=30)
info4 = models.CharField(max_length=30)
Run Code Online (Sandbox Code Playgroud)
如果我做 :
b = B.objects.get(id = n), it generates one database request.
Run Code Online (Sandbox Code Playgroud)
如果我做
print b.a.pk : it generate another request.
Run Code Online (Sandbox Code Playgroud)
是否可以访问ba主键(我只需要此信息,而不是info1或info2)而不生成另一个请求,也不使用'select_related()'?
我可以做一个:
print b.__dict__['a_id']
Run Code Online (Sandbox Code Playgroud)
它有效,但在我看来非常难看:你有更好的方式吗?
当我克隆一个django模型实例时,我习惯于清理'pk'字段.这似乎不适用于继承的模型:
拿着这个 :
class ModelA(models.Model):
info1 = models.CharField(max_length=64)
class ModelB(ModelA):
info2 = models.CharField(max_length=64)
class ModelC(ModelB):
info3 = models.CharField(max_length=64)
Run Code Online (Sandbox Code Playgroud)
现在让我们创建一个实例并按照"通常"的方式克隆它(我使用的是django shell):
In [1]: c=ModelC(info1="aaa",info2="bbb",info3="ccc")
In [2]: c.save()
In [3]: c.pk
Out[3]: 1L
In [4]: c.pk=None <------ to clone
In [5]: c.save() <------ should generate a new instance with a new index key
In [6]: c.pk
Out[6]: 1L <------ but don't
In [7]: ModelC.objects.all()
Out[7]: [<ModelC: ModelC object>] (only one instance !)
Run Code Online (Sandbox Code Playgroud)
我发现的唯一方法是:
In [16]: c.pk =None
In [17]: c.id=None
In [21]: …Run Code Online (Sandbox Code Playgroud) 我开始使用应用程序'django.contrib.staticfiles'将静态文件收集到我项目的/ static /目录中.
问题是,当我使用django开发服务器(manage.py runserver)时,它会自动提供静态文件.
它通常很好,但在我的情况下,我想自己提供这些静态文件.
我想在urls.py文件中添加类似的内容:
urlpatterns += patterns('',
url('^static/(?P<path>.*)$', myStaticMediaServe,{'document_root': settings.STATIC_ROOT ,'show_indexes': True}),
)
Run Code Online (Sandbox Code Playgroud)
问题是'django.contrib.staticfiles'应用程序在settings.DEBUG = True时优先使用'/ static /'url:我找不到让Django在使用时使用我的'/ static /'urlpattern描述的方法调试模式
如果我从settings.py中删除'django.contrib.staticfiles':我的'/ static /'urlpattern可以工作,但是我收集了静态文件.
你有想法使用'django.contrib.staticfiles'并通过urlpattern描述使用我自己的静态文件服务器并且有settins.DEBUG = True
在服务器上,对于磁盘优化,我们不安装C编译器,这就是问题所在:
我想用buildout 2.3.1安装' spur'python 包,spur正在使用需要C编译器的pycrypto.
为避免编译,我在服务器(Suse 11SP2)上安装了rpm python-pycrypto(python-pycrypto-2.6-31.7.x86_64.rpm).我可以用'pip freeze'来检查pycrypto的安装情况:
pip freeze
lxml==2.1.2
mod-python==3.3.1
Numeric==24.2
numpy==1.3.0
pycrypto==2.6
pywbem==0.7.0
PyXML==0.8.4
Run Code Online (Sandbox Code Playgroud)
然而,当我开始构建时,它仍然尝试使用不存在的C编译器构建pycrypto.
所以我在buildout.cfg中添加了include-site-packages = true和allowed-eggs-from-site-packages = pycrypto,但它们没有被考虑在内.我也尝试过:
python bootstrap.py --allow-site-packages
bin/buildout
Run Code Online (Sandbox Code Playgroud)
但这也没有帮助.
我可以做些什么来避免buildout编译已经从rpm编译和安装的软件包?
这是buildout.cfg
[buildout]
newest = false
extensions = gp.vcsdevelop
develop-dir = src
parts = eggs tests wsgi
include-site-packages = true
allowed-eggs-from-site-packages = pycrypto
eggs =
Django==1.4.8
ordereddict
ipython==0.13.2
django-webtest
django-grappelli<2.5.0
django-bootstrap3-datetimepicker
z3c.recipe.usercrontab
rrdgraphs
south
achilterm
pynag
pyaml<14
DjangoDevKit==1.0.3
Sphinx
xlwt
xlrd
spur
...
Run Code Online (Sandbox Code Playgroud)
和日志:
# bin/buildout
Unused options for …Run Code Online (Sandbox Code Playgroud) 如果我做这样的事情:
from mailbox import Mailbox
Mailbox.get = 'dummy'
Run Code Online (Sandbox Code Playgroud)
没有错误,我只是替换了get方法。但如果我做一个:
from datetime import datetime
datetime.now = 'dummy'
Run Code Online (Sandbox Code Playgroud)
我得到:
TypeError: can't set attributes of built-in/extension type 'datetime.datetime'
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为源代码在/usr/lib/python3.6/datetime.py. 我猜这个库是出于性能原因编译的,这就是它不能修改的原因。但是,那么,问题是:我怎么知道一个类是不可变的,因为它是内置的或扩展的(不像我那样只进行测试)?为什么我可以修补Mailbox类而不是datetime类?
Mysql 上的大表存在一些性能问题:该表有 3800 万行,大小为 3GB。我想通过测试 2 列来选择:我尝试了许多索引(每列一个索引,2 列一个索引),但查询仍然很慢:如下所示,获取 1644 行需要 4 秒以上:
SELECT `twstats_twwordstrend`.`id`, `twstats_twwordstrend`.`created`, `twstats_twwordstrend`.`freq`, `twstats_twwordstrend`.`word_id` FROM `twstats_twwordstrend` WHERE (`twstats_twwordstrend`.`word_id` = 1001 AND `twstats_twwordstrend`.`created` > '2011-11-07 14:01:34' );
...
...
...
1644 rows in set (4.66 sec)
EXPLAIN SELECT `twstats_twwordstrend`.`id`, `twstats_twwordstrend`.`created`, `twstats_twwordstrend`.`freq`, `twstats_twwordstrend`.`word_id` FROM `twstats_twwordstrend` WHERE (`twstats_twwordstrend`.`word_id` = 1001 AND `twstats_twwordstrend`.`created` > '2011-11-07 14:01:34' );
+----+-------------+----------------------+-------+-----------------------------------------------------+-----------------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------------+-------+-----------------------------------------------------+-----------------------+---------+------+------+-------------+
| …Run Code Online (Sandbox Code Playgroud) 我在里面使用 {% trans %} 用英语编写了我的模板。
我决定把它翻译成法语,所以我把它放在设置中:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
LANGUAGES = (
('en', _('English')),
('fr', _('French')),
)
LANGUAGE_CODE = 'fr'
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
Run Code Online (Sandbox Code Playgroud)
然后我使用 makemessages 和 compilemessages 来生成翻译后的字符串。这很好用!我的网站是法语。
但是现在我想让我的网站恢复为英文,所以我只需将 LANGUAGE_CODE 更改为:
LANGUAGE_CODE = 'en'
Run Code Online (Sandbox Code Playgroud)
但我的网站仍然是法语!甚至 django-debug-bar 仍然是法语。
我发现的唯一解决方法是在 LANGUAGES 中注释掉法语:
LANGUAGES = (
('en', _('English')),
# ('fr', _('French')),
)
Run Code Online (Sandbox Code Playgroud)
我正在打包我的源代码,但我不想包含测试和文档,因为它太大了。
为此,我将其包含在setup.py中:
setup(...
packages=find_packages(exclude=['tests.*','tests','docs.*','docs']),
...
)
Run Code Online (Sandbox Code Playgroud)
当做一个
python setup.py sdist
Run Code Online (Sandbox Code Playgroud)
我可以看到我的root tests /和docs / dirs以及其中的所有内容仍然包含在生成的发行版中。
似乎只有
python setup.py bdist
Run Code Online (Sandbox Code Playgroud)
对exclude参数很敏感。
为什么呢 是否可以排除“ setup.py sdist”的目录?
我曾经在 ubuntu 中运行 Python 3.6.7。今天,我尝试了非常新的 python 3.7.3,但我有点失望:在我看来,3.7 比 3.6 慢:
这两个版本都来自于 deadsnakes/ppa,当我运行 Python 基准测试套件时,许多测试中 3.7 应该比 3.6 快(dixit speed.python.org),我注意到相反的情况:
蟒蛇 3.6:
[ 1/47] 2to3...
INFO:root:Running `/home/elapouya/tmp/venv36/bin/python -u /home/elapouya/tmp/venv36/lib/python3.6/site-packages/performance/benchmarks/bm_2to3.py --output /tmp/tmp27lejbkn`
.....................
2to3: Mean +- std dev: 319 ms +- 5 ms
[ 2/47] chameleon...
INFO:root:Running `/home/elapouya/tmp/venv36/bin/python -u /home/elapouya/tmp/venv36/lib/python3.6/site-packages/performance/benchmarks/bm_chameleon.py --output /tmp/tmp_jvgzmw7`
.....................
chameleon: Mean +- std dev: 8.99 ms +- 0.13 ms
[ 3/47] chaos...
INFO:root:Running `/home/elapouya/tmp/venv36/bin/python -u /home/elapouya/tmp/venv36/lib/python3.6/site-packages/performance/benchmarks/bm_chaos.py --output /tmp/tmpbpea7n4x`
.....................
chaos: Mean +- std dev: 114 ms +- 2 …Run Code Online (Sandbox Code Playgroud) 实际上,pipenv将使用以下路径安装virtualenv:
$WORKON_HOME/<base_dir>-<hash>
Run Code Online (Sandbox Code Playgroud)
例如,是否可能确切地具有我想要的路径,即没有base_dir和和hash,所以:
/home/user/myapp_venv
Run Code Online (Sandbox Code Playgroud) 我使用 PyCharm 重命名我项目的一个分支:我要求将我的分支 v4.0.0 重命名为 v5.0.0,但我不知道为什么,但 PyCham@在目标名称中添加了一个。我懂了 :
svn ls svn+ssh://svn@devhost/myproject/branches/
v2.0.0/
v3.0.0/
v5.0.0@/ <----
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试列出此分支中的文件,我会得到:
svn ls svn+ssh://svn@devhost/myproject/branches/v5.0.0@/
svn: warning: W160013: URL 'svn+ssh://svn@devhost/myproject/branches/v5.0.0' non-existent in revision 15667
svn: E200009: Could not list all targets because some targets don't exist
Run Code Online (Sandbox Code Playgroud)
我尝试不使用@,或者使用%40:我有相同的消息。我尝试了该-r <some revision>选项以查看它是否是修订问题,但没有帮助。我尝试再次使用 PyCharm 重命名v5.0.0@为v5.0.0:它告诉我无法重命名为自身。我尝试再次使用 PyCharm 重命名v5.0.0@为v4.0.0: 它再次v4.0.0@用 a重命名@。
有趣的是pycharm仍然可以在里面浏览 svn+ssh://svn@devhost/myproject/branches/v5.0.0@/
在我的终端上,svn ls不起作用,svn co还有 ! 我自己无法创建工作副本! …