Thể loại
Tất cả

boxhoidap.com

Hỏi đáp

13677

13677

8

Từ điển an toàn chủ đề Python

CN, 08 Th07 2018 11. 15. 17 1000, Chris Angelico đã viết

[. ]

Show
  • Là chủ đề giá trị từ điển
  • Cách tốt nhất để lưu trữ từ điển Python là gì?
  • Giá trị từ điển có thể là bất biến?
  • Là danh sách trong chủ đề Python

> Chuỗi Python không chỉ chuyển đổi giữa các dòng mã,

Theo tôi hiểu, có thể có sự chuyển đổi giữa hai mã byte bất kỳ
hoặc có thể chỉ giữa các mã byte nhất định. Nhưng nhất định chi tiết hơn
hơn là chỉ giữa các dòng mã.

> nên
> tương tác thực tế phức tạp hơn bạn nói một chút. Trong CPython, thao tác gia tăng
> là.
>> 3 0 LOAD_GLOBAL 0 (i)
> 2 LOAD_CONST 1 (1)
> 4 INPLACE_ADD
> 6 STORE_GLOBAL 0 (i)
>> A context switch could happen between any pair of statements.

Nếu bạn thực sự muốn nói *câu lệnh* trái ngược với mã byte, thì
vị trí duy nhất có thể có một nút chuyển sẽ là trước LOAD_GLOBAL hoặc
after the STORE_GLOBAL (given that i is a built-in int and cannot have a
custom __iadd__ method).

Đó có phải là ý bạn không?

> Trong ví dụ cụ thể
> này, kết quả cuối cùng không thay đổi - kết quả nhất quán là
> 2 và 3, không có gì khác - nhưng .
> the separate steps might be significant.

Thật may là tôi không nói về các đoạn mã khác, chỉ có đoạn mã
được hiển thị. -)

> Ví dụ: nếu bạn thay thế "i
> = 1" bằng "i = i", để nhân đôi giá trị, bạn sẽ nhận được giá trị này.
>> 3 0 LOAD_GLOBAL 0 (i)
> 2 LOAD_GLOBAL 0 (i)
> 4 INPLACE_ADD
> 6 STORE_GLOBAL 0 (i)
>> and that could potentially have both of them load the initial value,
> then one of them runs to completion, and then the other loads the result
> - so it'll add 1 and 2 and have a result of 3, rather than 2 or 4.

Một số người, khi gặp sự cố, nói: "Tôi biết, tôi sẽ sử dụng
luồng". Không có vấn đề gì về vấn đề này.

> Nhưng bạn hoàn toàn đúng khi chỉ có một số ít
> kết quả hợp lý, ngay cả khi có liên quan đến phân luồng.

Thật vậy. Mặc dù luồng không xác định, nhưng nó không *hoàn toàn*
không bị ràng buộc.

Gian hàng Duncan

2007-05-10 13. 57. 35 UTC

liên kết cố định

- tôi có cần ghi đè lên một phương thức khác không e. g. update() hoặc items() trong
để duy trì luồng an toàn hay như vậy đã đủ chưa?

Không, bạn sẽ cần bảo vệ hầu hết mọi thứ. các mặt hàng có thể được an toàn. update,
xóa, get, has_key, pop và setdefault đều cần khóa trong
trường hợp chung.
Ngoài ra, hãy lưu ý rằng một số phần bên trong Python bỏ qua những thứ như __getitem__ trong
các lớp con dict, vì vậy khóa sẽ bị bỏ qua nếu (ví dụ) bạn sử dụng
dict as a namespace for exec.

- trong __getitem__, nó có mở khóa sau khi trả lại vật phẩm không?
- sử dụng luồng sẽ tốt hơn. RLock, tắt tiếng,. thay vào đó?

Loại dict dựng sẵn đã là luồng an toàn

It very much depends on what you mean by 'thread safe'. Calls to dict
methods from multiple threads won't result in Python getting into an
inconsistent state and crashing, but they aren't necessarily atomic either.
In particular, any method which can modify the content of the dictionary
could release an instance of a class with a __del__ method written in
Python and other threads will be able to run at that point.
Likewise any lookup in a dict where a key is an instance of a class with
user-defined comparison method could allow Python code and therefore other
threads to run.
Of course if your particular dict objects all use simple types this may not
matter, but it needs a careful programmer to use an ordinary Python dict
(or list) safely across threads.
IMHO you are probably best to write a thread-safe class which uses an
ordinary dict (and has a nicely limited interface) rather than trying to
produce a completely thread-safe dict type.

Nguồn chính của

df['col1'].update(pd.Series(di))
5 là trên một ngọn núi ở miền trung Thụy Sĩ. Chúng tôi sử dụng kiểm soát phiên bản phân tán (git). Không có trung tâm trung tâm. Mỗi bản sao có thể trở thành một nguồn mới vì lợi ích của tất cả. Các bản sao công khai ưa thích của
df['col1'].update(pd.Series(di))
5 là

Mặc dù các kiểu dữ liệu tích hợp sẵn của Python, chẳng hạn như từ điển, dường như có các hoạt động nguyên tử, nhưng có một số trường hợp chúng không phải là nguyên tử (e. g. nếu __hash__ hoặc __eq__ được triển khai dưới dạng các phương thức Python) và không nên dựa vào tính nguyên tử của chúng. Bạn cũng không nên dựa vào phép gán biến nguyên tử (vì điều này lại phụ thuộc vào từ điển)

Sử dụng kiểu dữ liệu Queue của mô-đun Queue làm cách ưu tiên để giao tiếp dữ liệu giữa các luồng. Nếu không, hãy sử dụng mô-đun luồng và các nguyên hàm khóa của nó. Tìm hiểu về cách sử dụng hợp lý các biến điều kiện để bạn có thể sử dụng phân luồng. Điều kiện thay vì sử dụng khóa cấp thấp hơn

Trường hợp 1. Nếu các khóa của

df['col1'].update(pd.Series(di))
7 dùng để chỉ các giá trị chỉ mục, thì bạn có thể sử dụng phương thức
import pandas as pd
import numpy as np
df = pd.DataFrame({'col1':['w', 10, 20],
'col2': ['a', 30, np.nan]},
index=[1,2,0])
# col1 col2
# 1 w a
# 2 10 30
# 0 20 NaN
di = {0: "A", 2: "B"}
# The value at the 0-index is mapped to 'A', the value at the 2-index is mapped to 'B'
df['col1'].update(pd.Series(di))
print(df)
3

df['col1'].update(pd.Series(di))

Ví dụ,

import pandas as pd
import numpy as np
df = pd.DataFrame({'col1':['w', 10, 20],
'col2': ['a', 30, np.nan]},
index=[1,2,0])
# col1 col2
# 1 w a
# 2 10 30
# 0 20 NaN
di = {0: "A", 2: "B"}
# The value at the 0-index is mapped to 'A', the value at the 2-index is mapped to 'B'
df['col1'].update(pd.Series(di))
print(df)

sản lượng

  col1 col2
1 w a
2 B 30
0 A NaN

Tôi đã sửa đổi các giá trị từ bài đăng gốc của bạn để rõ ràng hơn về những gì

import pandas as pd
import numpy as np
df = pd.DataFrame({'col1':['w', 10, 20],
'col2': ['a', 30, np.nan]},
index=[1,2,0])
# col1 col2
# 1 w a
# 2 10 30
# 0 20 NaN
di = {0: "A", 2: "B"}
# The value at the 0-index is mapped to 'A', the value at the 2-index is mapped to 'B'
df['col1'].update(pd.Series(di))
print(df)
3 đang làm. Lưu ý cách các khóa trong
df['col1'].update(pd.Series(di))
7 được liên kết với các giá trị chỉ mục. Thứ tự của các giá trị chỉ mục -- nghĩa là vị trí chỉ mục -- không thành vấn đề


trường hợp 2. Nếu các khóa trong

df['col1'].update(pd.Series(di))
7 đề cập đến các giá trị của
import pandas as pd
import numpy as np
df = pd.DataFrame({'col1':['w', 10, 20],
'col2': ['a', 30, np.nan]},
index=[1,2,0])
# col1 col2
# 1 w a
# 2 10 30
# 0 20 NaN
di = {0: "A", 2: "B"}
# The value at the 0-index is mapped to 'A', the value at the 2-index is mapped to 'B'
df['col1'].update(pd.Series(di))
print(df)
0, thì @DanAllan và @DSM sẽ chỉ ra cách đạt được điều này với
import pandas as pd
import numpy as np
df = pd.DataFrame({'col1':['w', 10, 20],
'col2': ['a', 30, np.nan]},
index=[1,2,0])
# col1 col2
# 1 w a
# 2 10 30
# 0 20 NaN
di = {0: "A", 2: "B"}
# The value at the 0-index is mapped to 'A', the value at the 2-index is mapped to 'B'
df['col1'].update(pd.Series(di))
print(df)
8

import pandas as pd
import numpy as np
df = pd.DataFrame({'col1':['w', 10, 20],
'col2': ['a', 30, np.nan]},
index=[1,2,0])
print(df)
# col1 col2
# 1 w a
# 2 10 30
# 0 20 NaN
di = {10: "A", 20: "B"}
# The values 10 and 20 are replaced by 'A' and 'B'
df['col1'].replace(di, inplace=True)
print(df)

sản lượng

________số 8

Lưu ý cách trong trường hợp này, các khóa trong

df['col1'].update(pd.Series(di))
7 đã được thay đổi để khớp với các giá trị trong
import pandas as pd
import numpy as np
df = pd.DataFrame({'col1':['w', 10, 20],
'col2': ['a', 30, np.nan]},
index=[1,2,0])
# col1 col2
# 1 w a
# 2 10 30
# 0 20 NaN
di = {0: "A", 2: "B"}
# The value at the 0-index is mapped to 'A', the value at the 2-index is mapped to 'B'
df['col1'].update(pd.Series(di))
print(df)
0


Trường hợp 3. Nếu các khóa trong

df['col1'].update(pd.Series(di))
7 đề cập đến các vị trí chỉ mục, thì bạn có thể sử dụng

df['col1'].update(pd.Series(di))
0

từ

df['col1'].update(pd.Series(di))
1

sản lượng

df['col1'].update(pd.Series(di))
2

Ở đây, hàng đầu tiên và hàng thứ ba đã được thay đổi, bởi vì các khóa trong

df['col1'].update(pd.Series(di))
7 là
  col1 col2
1 w a
2 B 30
0 A NaN
3 và
  col1 col2
1 w a
2 B 30
0 A NaN
4, với cách lập chỉ mục dựa trên 0 của Python đề cập đến vị trí thứ nhất và thứ ba

Là chủ đề giá trị từ điển

Không. Từ điển không phải là luồng an toàn . Từ điển

Cách tốt nhất để lưu trữ từ điển Python là gì?

Tệp văn bản
. store them as strings in text files.

Giá trị từ điển có thể là bất biến?

Thứ hai, khóa từ điển phải thuộc loại không thay đổi . Ví dụ: bạn có thể sử dụng số nguyên, số float, chuỗi hoặc Boolean làm khóa từ điển. Tuy nhiên, cả danh sách và từ điển khác đều không thể đóng vai trò là khóa từ điển vì danh sách và từ điển có thể thay đổi.

Là danh sách trong chủ đề Python

Hầu hết các hoạt động danh sách đều nguyên tử. Nhiều thao tác phổ biến trong danh sách là nguyên tử, nghĩa là chúng an toàn cho luồng .

Dịch vụ SEO website - Thiết kế Website

★★★★★ 7 đánh giá trên Google
Văn phòng công ty

Địa chỉ: Số 5 Trần Kim Xuyến - P.Trung Hoà - Q.Cầu Giấy - TP. Hả Nội

Điện thoại: 0922 892 892

Trang web: Bangnam.com

Từ Dịch vụ SEO website - Thiết kế Website

"BANGNAM là đơn vị cung cấp Dịch Vụ SEO, Dịch vụ thiết kế Website, Giải pháp quản trị doanh nghiệp ERP hàng đầu tại Việt Nam."

Mọi người cũng tìm kiếm

Thiết kế website Hà Nội
Nhà thiết kế trang web
Thiết kế website bán hàng
Nhà thiết kế trang web
Dịch vụ SEO
Nhà tối ưu công cụ tìm kiếm
Thiết kế website TP HCM
Nhà thiết kế trang web
Thiết kế website Hà Nội
Nhà thiết kế trang web