Comment python code les caractères en interne ?

Je pense qu'il utilise UTF-16

a marqué ce sujet comme résolu.

Bonjour,
Du fait de l’héritage de C, python utilise la plupart du temps un mot de 16 bits pour représenter un caractère, mais 2 mots de 16 bits quand il s’agit par exemple d’un emoji ou d’un caractère chinois "extension B".
En fait, je pense que python doit utiliser UTF-16 en interne.
Dans cette hypothèse, le traitement d’une chaîne sur 2 fois 16 bits devrait être plus long que le traitement d’une chaîne ASCII.
Mais ce n’est pas ce que je constate, je trouve des valeurs très proches.
Soit pae exemple la chaîne 'abcde' et la chaîne '𦀀𦀁𦀂𦀃𦀄𦀅𦀆𦀇’.
Pour la première chaîne, ce sont des caractères ASCII codés sur 1 mot de 16 bits.
Pour le seconde chaîne, ce sont des caractères de l’extension B, codés sur 2 mots de 16 bits en UTF-16.

Mais je trouve des valeurs du même ordre.

Mon code de test :

import time

A = 'abcdefgh'
#chaîne ASCII (1 codet de 16 bits en UTF-16)

B = '𦀀𦀁𦀂𦀃𦀄𦀅𦀆𦀇'
#chaîne extension B (2 codets de 16 bits en UTF-16)

C = '一二三四五六七八'
#chaîne en chinois sipmlifé (1 codet de 16 bits en UTF-16)

Testcar = '𠁵'

repeat = 10000000

print(len(A))
print(len(B))
print(len(C))
print(Testcar)
print(repeat)

start = time.perf_counter()
for x in range(repeat):
    if Testcar in A:
        i = 0
end = time.perf_counter()

print ('chaîne ASCII', end-start)

start = time.perf_counter()
for x in range(repeat):
    if Testcar in B:
        i = 0
end = time.perf_counter()

print ('chaîne extension B', end-start)

start = time.perf_counter()
for x in range(repeat):
    if Testcar in C:
        i = 0
end = time.perf_counter()

print ('chaîne chinois simplifié', end-start)

Quelqu’un a une idée ?.

+0 -0

Merci.

Si j’ai bien compris, en mémoire, on a 1, 2 ou 4 octets suivant les cas.
Donc peu ou pas d’impact en temps d’exécution, mais un impact en terme de mémoire utilisée.

+0 -0

Si j’ai bien compris, en mémoire, on a 1, 2 ou 4 octets suivant les cas.
Donc peu ou pas d’impact en temps d’exécution, mais un impact en terme de mémoire utilisée.

etherpin

Oui. De toute façon, si tu en es à micro-manager la taille des strings en mémoire, il y a de fortes chances pour que Python ne soit pas l’outil approprié à ce que tu essaies de faire.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte